亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? bmpfile.cpp

?? CT工作站具有打印報告、病歷管理、圖像處理專家詞庫等功能
?? CPP
字號:
//	bmpops.cpp : implementation of the BMPFile class
//	
//	This handles the reading and writing of BMP files.
//
//

#include "stdafx.h"
#include "bmpfile.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


BMPFile::BMPFile()
{
	m_errorText="OK";
}

////////////////////////////////////////////////////////////////////////////
//	load a .BMP file - 1,4,8,24 bit
//
//	allocates and returns an RGB buffer containing the image.
//	modifies width and height accordingly - NULL, 0, 0 on error

BYTE * BMPFile::LoadBMP(CString fileName, 
						UINT *width, 
						UINT *height)
{
	BITMAP inBM;

	BYTE m1,m2;
    long filesize;
    short res1,res2;
    long pixoff;
    long bmisize;                    
    long compression;
    unsigned long sizeimage;
    long xscale, yscale;
    long colors;
    long impcol;
    

	BYTE *outBuf=NULL;
	
	// for safety
	*width=0; *height=0;

	// init
	m_errorText="OK";
	m_bytesRead=0;

	FILE *fp;
	
	fp=fopen(fileName,"rb");
	if (fp==NULL) {
		CString msg;                    
		msg="Can't open file for reading :\n"+fileName;
		m_errorText=msg;
		return NULL;
	} else {
	    long rc;
		rc=fread((BYTE  *)&(m1),1,1,fp); m_bytesRead+=1;
		if (rc==-1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((BYTE  *)&(m2),1,1,fp); m_bytesRead+=1;
		if (rc==-1) m_errorText="Read Error!";
		if ((m1!='B') || (m2!='M')) {
			m_errorText="Not a valid BMP File";
			fclose(fp);
			return NULL;
        }
        
		////////////////////////////////////////////////////////////////////////////
		//
		//	read a ton of header stuff

		rc=fread((long  *)&(filesize),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((int  *)&(res1),2,1,fp); m_bytesRead+=2;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((int  *)&(res2),2,1,fp); m_bytesRead+=2;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(pixoff),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(bmisize),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(inBM.bmWidth),4,1,fp);	 m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(inBM.bmHeight),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((int  *)&(inBM.bmPlanes),2,1,fp); m_bytesRead+=2;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((int  *)&(inBM.bmBitsPixel),2,1,fp); m_bytesRead+=2;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(compression),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(sizeimage),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(xscale),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(yscale),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(colors),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		rc=fread((long  *)&(impcol),4,1,fp); m_bytesRead+=4;
		if (rc!=1) {m_errorText="Read Error!"; fclose(fp); return NULL;}

		////////////////////////////////////////////////////////////////////////////
		//	i don't do RLE files

		if (compression!=BI_RGB) {
	    	m_errorText="This is a compressed file.";
	    	fclose(fp);
	    	return NULL;
	    }

		if (colors == 0) {
			colors = 1 << inBM.bmBitsPixel;
		}


		////////////////////////////////////////////////////////////////////////////
		// read colormap

		RGBQUAD *colormap = NULL;

		switch (inBM.bmBitsPixel) {
		case 24:
			break;
			// read pallete 
		case 1:
		case 4:
		case 8:
			colormap = new RGBQUAD[colors];
			if (colormap==NULL) {
				fclose(fp);
				m_errorText="Out of memory";
				return NULL;
			}

			int i;
			for (i=0;i<colors;i++) {
				BYTE r,g,b, dummy;

				rc=fread((BYTE *)&(b),1,1,fp);
				m_bytesRead++;
				if (rc!=1) {
					m_errorText="Read Error!";	
					delete [] colormap;
					fclose(fp);
					return NULL;
				}

				rc=fread((BYTE  *)&(g),1,1,fp); 
				m_bytesRead++;
				if (rc!=1) {
					m_errorText="Read Error!";	
					delete [] colormap;
					fclose(fp);
					return NULL;
				}

				rc=fread((BYTE  *)&(r),1,1,fp); 
				m_bytesRead++;
				if (rc!=1) {
					m_errorText="Read Error!";	
					delete [] colormap;
					fclose(fp);
					return NULL;
				}


				rc=fread((BYTE  *)&(dummy),1,1,fp); 
				m_bytesRead++;
				if (rc!=1) {
					m_errorText="Read Error!";	
					delete [] colormap;
					fclose(fp);
					return NULL;
				}

				colormap[i].rgbRed=r;
				colormap[i].rgbGreen=g;
				colormap[i].rgbBlue=b;
			}
			break;
		}


		if ((long)m_bytesRead>pixoff) {
			fclose(fp);
			m_errorText="Corrupt palette";
			delete [] colormap;
			fclose(fp);
			return NULL;
		}

		while ((long)m_bytesRead<pixoff) {
			char dummy;
			fread(&dummy,1,1,fp);
			m_bytesRead++;
		}

		int w=inBM.bmWidth;
		int h=inBM.bmHeight;

		// set the output params
		*width=w;
		*height=h;

		long row_size = w * 3;

		long bufsize = (long)w * 3 * (long)h;

		////////////////////////////////////////////////////////////////////////////
		// alloc our buffer

		outBuf=(BYTE *) new BYTE [bufsize];
		if (outBuf==NULL) {
			m_errorText="Memory alloc Failed";
		} else {

			////////////////////////////////////////////////////////////////////////////
			//	read it

			long row=0;
			long rowOffset=0;

			// read rows in reverse order
			for (row=inBM.bmHeight-1;row>=0;row--) {

				// which row are we working on?
				rowOffset=(long unsigned)row*row_size;						      

				if (inBM.bmBitsPixel==24) {

					for (int col=0;col<w;col++) {
						long offset = col * 3;
						char pixel[3];

						if (fread((void  *)(pixel),1,3,fp)==3) {
							// we swap red and blue here
							*(outBuf + rowOffset + offset + 0)=pixel[2];		// r
							*(outBuf + rowOffset + offset + 1)=pixel[1];		// g
							*(outBuf + rowOffset + offset + 2)=pixel[0];		// b
						}

					}

					m_bytesRead+=row_size;
					
					// read DWORD padding
					while ((m_bytesRead-pixoff)&3) {
						char dummy;
						if (fread(&dummy,1,1,fp)!=1) {
							m_errorText="Read Error";
							delete [] outBuf;
							fclose(fp);
							return NULL;
						}

						m_bytesRead++;
					}
 
					
				} else {	// 1, 4, or 8 bit image

					////////////////////////////////////////////////////////////////
					// pixels are packed as 1 , 4 or 8 bit vals. need to unpack them

					int bit_count = 0;
					UINT mask = (1 << inBM.bmBitsPixel) - 1;

					BYTE inbyte=0;

					for (int col=0;col<w;col++) {
						
						int pix=0;

						// if we need another byte
						if (bit_count <= 0) {
							bit_count = 8;
							if (fread(&inbyte,1,1,fp)!=1) {
								m_errorText="Read Error";
								delete [] outBuf;
								delete [] colormap;
								fclose(fp);
								return NULL;
							}
							m_bytesRead++;
						}

						// keep track of where we are in the bytes
						bit_count -= inBM.bmBitsPixel;
						pix = ( inbyte >> bit_count) & mask;

						// lookup the color from the colormap - stuff it in our buffer
						// swap red and blue
						*(outBuf + rowOffset + col * 3 + 2) = colormap[pix].rgbBlue;
						*(outBuf + rowOffset + col * 3 + 1) = colormap[pix].rgbGreen;
						*(outBuf + rowOffset + col * 3 + 0) = colormap[pix].rgbRed;
					}

					// read DWORD padding
					while ((m_bytesRead-pixoff)&3) {
						char dummy;
						if (fread(&dummy,1,1,fp)!=1) {
							m_errorText="Read Error";
							delete [] outBuf;
							if (colormap)
								delete [] colormap;
							fclose(fp);
							return NULL;
						}
						m_bytesRead++;
					}
				}
			}
		
		}

		if (colormap) {
			delete [] colormap;
		}

		fclose(fp);

    }

	return outBuf;
}

////////////////////////////////////////////////////////////////////////////
//	write a 24-bit BMP file
//
//	image MUST be a packed buffer (not DWORD-aligned)
//	image MUST be vertically flipped !
//	image MUST be BGR, not RGB !
//

void BMPFile::SaveBMP(CString fileName,		// output path
							BYTE * buf,				// BGR buffer
							UINT width,				// pixels
							UINT height)
{
	short res1=0;
    short res2=0;
    long pixoff=54;
    long compression=0;
    long cmpsize=0;
    long colors=0;
    long impcol=0;
	char m1='B';
	char m2='M';

	m_errorText="OK";

	DWORD widthDW = WIDTHBYTES(width * 24);

	long bmfsize=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
  							widthDW * height;	
	long byteswritten=0;

	BITMAPINFOHEADER header;
  	header.biSize=40; 						// header size
	header.biWidth=width;
	header.biHeight=height;
	header.biPlanes=1;
	header.biBitCount=24;					// RGB encoded, 24 bit
	header.biCompression=BI_RGB;			// no compression
	header.biSizeImage=0;
	header.biXPelsPerMeter=0;
	header.biYPelsPerMeter=0;
	header.biClrUsed=0;
	header.biClrImportant=0;

	FILE *fp;	
	fp=fopen(fileName,"wb");
	if (fp==NULL) {
		m_errorText="Can't open file for writing";
		return;
	}

	// should probably check for write errors here...
	
	fwrite((BYTE  *)&(m1),1,1,fp); byteswritten+=1;
	fwrite((BYTE  *)&(m2),1,1,fp); byteswritten+=1;
	fwrite((long  *)&(bmfsize),4,1,fp);	byteswritten+=4;
	fwrite((int  *)&(res1),2,1,fp); byteswritten+=2;
	fwrite((int  *)&(res2),2,1,fp); byteswritten+=2;
	fwrite((long  *)&(pixoff),4,1,fp); byteswritten+=4;

	fwrite((BITMAPINFOHEADER *)&header,sizeof(BITMAPINFOHEADER),1,fp);
	byteswritten+=sizeof(BITMAPINFOHEADER);
	
	long row=0;
	long rowidx;
	long row_size;
	row_size=header.biWidth*3;
    long rc;
	for (row=0;row<header.biHeight;row++) {
		rowidx=(long unsigned)row*row_size;						      

		// write a row
		rc=fwrite((void  *)(buf+rowidx),row_size,1,fp);
		if (rc!=1) {
			m_errorText="fwrite error\nGiving up";
			break;
		}
		byteswritten+=row_size;	

		// pad to DWORD
		for (DWORD count=row_size;count<widthDW;count++) {
			char dummy=0;
			fwrite(&dummy,1,1,fp);
			byteswritten++;							  
		}

	}
           
	fclose(fp);
}


////////////////////////////////////////////////////////////////////////////////////
//
//	1,4,8 bit BMP stuff
//
//	if you have a color-mapped image and a color map...
//
//	the BMP saving code in SaveColorMappedBMP modified from Programming 
//	for Graphics Files in C and C++, by John Levine.

void BMPFile::SaveBMP(CString fileName, 			// output path
								 BYTE * colormappedbuffer,	// one BYTE per pixel colomapped image
								 UINT width,
								 UINT height,
 								 int bitsperpixel,			// 1, 4, 8
								 int colors,				// number of colors (number of RGBQUADs)
								 RGBQUAD *colormap)			// array of RGBQUADs 
{
	int datasize, cmapsize, byteswritten, row, col;

	m_errorText="OK";

	if (bitsperpixel == 24) {
		// the routines could be combined, but i don't feel like it
		m_errorText="We don't do 24-bit files in here, sorry";
		return;
	} else
		cmapsize = colors * 4;

	datasize = BMP_PIXELSIZE(width, height, bitsperpixel);

	long filesize = BMP_HEADERSIZE + cmapsize + datasize;
	int res1, res2;
	res1 = res2 = 0;

	long pixeloffset = BMP_HEADERSIZE + cmapsize;

	int bmisize = 40;
	long cols = width;
	long rows = height;
	WORD planes = 1;
	long compression =0;
	long cmpsize = datasize;
	long xscale = 0;
	long yscale = 0;
	long impcolors = colors;

	FILE *fp;
	fp = fopen(fileName, "wb");
	if (fp==NULL) {
		m_errorText="Can't Open";
		return;
	}
	char bm[2];
	bm[0]='B';
	bm[1]='M';

	// header stuff
	BITMAPFILEHEADER bmfh;
	bmfh.bfType=*(WORD *)&bm; 
    bmfh.bfSize= filesize; 
    bmfh.bfReserved1=0; 
    bmfh.bfReserved2=0; 
    bmfh.bfOffBits=pixeloffset; 

	fwrite(&bmfh, sizeof (BITMAPFILEHEADER), 1, fp);


	BITMAPINFOHEADER bmih;
	bmih.biSize = bmisize; 
	bmih.biWidth = cols; 
	bmih.biHeight = rows; 
	bmih.biPlanes = planes; 
	bmih.biBitCount =bitsperpixel;
	bmih.biCompression = compression; 
	bmih.biSizeImage = cmpsize; 
	bmih.biXPelsPerMeter = xscale; 
	bmih.biYPelsPerMeter = yscale; 
	bmih.biClrUsed = colors;
	bmih.biClrImportant = impcolors;
	
	fwrite(&bmih, sizeof (BITMAPINFOHEADER), 1, fp);

	if (cmapsize) {
		int i;
		for (i = 0; i< colors; i++) {
			putc(colormap[i].rgbRed, fp);
			putc(colormap[i].rgbGreen, fp);
			putc(colormap[i].rgbBlue, fp);
			putc(0, fp);	// dummy
		}
	}

	byteswritten = BMP_HEADERSIZE + cmapsize;

	for (row = 0; row< (int)height; row++) {
		int pixbuf;
		int nbits = 0;

		for (col =0 ; col < (int)width; col++) {
			int offset = row * width + col;	// offset into our color-mapped RGB buffer
			BYTE pval = *(colormappedbuffer + offset);

			pixbuf = (pixbuf << bitsperpixel) | pval;

			nbits += bitsperpixel;

			if (nbits > 8) {
				m_errorText="Error : nBits > 8????";
				fclose(fp);
				return;
			}

			if (nbits == 8) {
				putc(pixbuf, fp);
				pixbuf=0;
				nbits=0;
				byteswritten++;
			}
		} // cols

		if (nbits > 0) {
			putc(pixbuf, fp);		// write partially filled byte
			byteswritten++;
		}

		// DWORD align
		while ((byteswritten -pixeloffset) & 3) {
			putc(0, fp);
			byteswritten++;
		}

	}	//rows

	if (byteswritten!=filesize) {
		m_errorText="byteswritten != filesize";
	}

	fclose(fp);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品99久久久久久久久| 日韩精品一区二区三区老鸭窝| 在线不卡免费av| 成人免费在线播放视频| 成人黄色网址在线观看| 精品国产91乱码一区二区三区| 美女在线一区二区| 欧美一区二区三区免费视频| 日本va欧美va瓶| 欧美精品一区在线观看| 欧洲国内综合视频| 日韩在线一区二区| 91精品欧美一区二区三区综合在 | 国产精品无遮挡| 99re66热这里只有精品3直播| 亚洲美女精品一区| 欧美视频第二页| 久久精品无码一区二区三区 | 亚洲不卡一区二区三区| 91在线观看免费视频| 亚洲成人动漫在线免费观看| 中文字幕亚洲欧美在线不卡| 久久亚洲一级片| 在线观看成人小视频| 日韩影院精彩在线| 国产精品久久久久久久蜜臀| 色先锋久久av资源部| 亚洲国产毛片aaaaa无费看 | 国模一区二区三区白浆| 久久精品一二三| 欧美mv日韩mv国产| 色哟哟国产精品免费观看| 成人污视频在线观看| 亚洲午夜激情网页| 一区二区三区中文字幕| 精品精品欲导航| 91精品蜜臀在线一区尤物| 欧美日韩在线播放三区| 精品一区二区在线播放| 亚洲黄色片在线观看| 久久蜜桃一区二区| 欧美精品粉嫩高潮一区二区| 欧美亚洲国产一区二区三区| 日本久久一区二区| 国产91色综合久久免费分享| 日本在线不卡视频| 亚洲欧美另类小说视频| 亚洲日本成人在线观看| 亚洲精品一区二区三区福利| 久久久久国产精品人| 国产欧美日韩在线视频| 欧美成人性战久久| 久久久久国产一区二区三区四区| 国产视频一区二区在线观看| 国产精品伦一区| 亚洲免费观看高清| 日韩激情中文字幕| 精品一区二区久久| 成人涩涩免费视频| 色香蕉久久蜜桃| 欧美一级爆毛片| 欧美精品免费视频| 精品国产精品一区二区夜夜嗨| 久久综合色婷婷| 亚洲同性gay激情无套| 亚洲午夜免费福利视频| 男人的天堂久久精品| 国产成人精品三级| 国产美女主播视频一区| 久久er99热精品一区二区| 午夜电影一区二区三区| 亚洲一区二区成人在线观看| 亚洲色图制服诱惑| 轻轻草成人在线| 成人app软件下载大全免费| 欧美视频在线不卡| www久久精品| 亚洲另类在线制服丝袜| 精品一区二区免费看| 91影院在线观看| 91精品在线免费| 国产农村妇女毛片精品久久麻豆 | 一本一道波多野结衣一区二区| 欧美二区在线观看| 日本一区二区久久| 91精品欧美一区二区三区综合在 | 久久精品99国产精品| 成人黄色一级视频| 在线不卡一区二区| 国产精品视频免费看| 美女爽到高潮91| 色94色欧美sute亚洲线路一久| 日韩免费一区二区三区在线播放| 日本一区免费视频| 日韩二区在线观看| 91丨porny丨国产| 久久久激情视频| 青草国产精品久久久久久| 成人午夜视频在线观看| 日韩欧美国产综合| 亚洲一区二区精品久久av| 成人性生交大片| 欧美成人aa大片| 亚洲一级不卡视频| 99热99精品| 99久久国产综合色|国产精品| 欧美一区二区三区四区久久| 亚洲美女在线国产| 国产成人欧美日韩在线电影| 91精品中文字幕一区二区三区| 国产精品成人一区二区艾草| 激情五月婷婷综合| 91精品国产一区二区三区蜜臀 | 久久精品水蜜桃av综合天堂| 免费观看日韩电影| 欧美人狂配大交3d怪物一区 | 久久免费的精品国产v∧| 丝袜a∨在线一区二区三区不卡| 色综合天天在线| 欧美亚洲综合一区| 亚洲视频在线观看三级| 国产.精品.日韩.另类.中文.在线.播放| 日韩三级.com| 天堂久久一区二区三区| 欧美三级视频在线| 亚洲一区二区欧美日韩| 欧美在线视频全部完| 一区二区三区色| 在线区一区二视频| 一区二区在线电影| 色美美综合视频| 亚洲激情中文1区| 在线免费观看日本一区| 综合久久久久综合| 91久久免费观看| 伊人婷婷欧美激情| 欧美日韩一区二区欧美激情| 亚洲一区二区黄色| 欧美日韩国产大片| 欧美aaa在线| 久久亚洲一区二区三区四区| 国产一区二区精品久久99| 国产亚洲精品超碰| 成人免费视频视频| 亚洲色欲色欲www| 欧美三级在线播放| 喷水一区二区三区| 国产午夜三级一区二区三| 欧美做爰猛烈大尺度电影无法无天| 中文字幕高清一区| 色呦呦一区二区三区| 亚洲五月六月丁香激情| 欧美日韩mp4| 久久99久久久久| 国产亚洲一区字幕| 一本色道久久综合亚洲精品按摩| 一区二区三区 在线观看视频| 欧美日韩另类国产亚洲欧美一级| 偷偷要91色婷婷| 久久久久久久综合色一本| 99久久夜色精品国产网站| 香蕉成人啪国产精品视频综合网 | 一区二区中文字幕在线| 色综合一区二区三区| 日本不卡在线视频| 久久久久久99精品| 91色视频在线| 麻豆精品国产传媒mv男同 | 蜜臀av亚洲一区中文字幕| 国产午夜精品理论片a级大结局| 91香蕉视频污| 日韩二区在线观看| 国产精品久久久久久妇女6080| 欧美日韩精品专区| 国产成人丝袜美腿| 亚洲v日本v欧美v久久精品| 精品乱码亚洲一区二区不卡| 99精品国产99久久久久久白柏| 日韩专区一卡二卡| 日韩欧美亚洲国产精品字幕久久久 | 亚洲精品老司机| 日韩欧美一级二级三级久久久| 福利一区福利二区| 性感美女极品91精品| 国产欧美日本一区二区三区| 欧美色大人视频| 成人精品小蝌蚪| 麻豆91免费看| 亚洲一区二区免费视频| 国产欧美日韩另类视频免费观看| 欧美吻胸吃奶大尺度电影| 国产高清成人在线| 日韩电影免费在线看| 一区免费观看视频| 久久久久久99精品| 欧美一区二区三区小说| 欧洲亚洲国产日韩| av在线这里只有精品| 国产麻豆视频精品| 丝袜亚洲另类丝袜在线|