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

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

?? hdib.cpp

?? VC++高級編程技巧與示例
?? CPP
字號:
// HDib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HDib.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDib::CDib()
{
	m_BmpLoaded=FALSE;
	m_Buffer=0;
	m_BmpInfo=0;
	m_Quad=0;
	m_hPal=0;
	BmpMarker=('M'<<8)|'B';
	Width=0;
	Height=0;
}

CDib::~CDib()
{
	Free();
}

//釋放所有動態(tài)分配的內(nèi)存:
void CDib::Free()
{
	if(m_Buffer)
	{
		delete [] m_Buffer;
		m_Buffer=0;
	}
	if(m_BmpInfo)
	{
		delete [] m_BmpInfo;
		m_BmpInfo=0;
	}
	if(m_Quad)
	{
		delete [] m_Quad;
		m_Quad=0;
	}
}

//從文件中讀取位圖:
BOOL CDib::LoadBmp(LPCTSTR fn)
{
	if(fn=="")
	{
		return FALSE;
	}
	Free();

	//打開bmp文件:
	ifstream files(fn,ios::binary|ios::nocreate);
	if(!files.is_open())
	{
		return FALSE;
	}

	//讀入BITMAPFILEHEADER:
	files.read((LPSTR)&m_BmpFH, sizeof(BITMAPFILEHEADER));

	//判斷是否是bmp文件:
	if (m_BmpFH.bfType != BmpMarker)
	{
		return FALSE;
	}

	//讀入BITMAPINFO:
	DWORD bmpinfosz;
	bmpinfosz=m_BmpFH.bfOffBits-sizeof(BITMAPFILEHEADER) 
		      +256*sizeof(RGBQUAD);
	m_BmpInfo=(LPBITMAPINFO) new BYTE[bmpinfosz];
	files.read((char *)m_BmpInfo,m_BmpFH.bfOffBits-sizeof(BITMAPFILEHEADER));

	//計(jì)算位圖的相關(guān)數(shù)據(jù)信息:
	CalBmpData();
	//只支持8位以上的位圖:
	if(BPP<8||BPP>32)
	{
		Free();
		return FALSE;
	}
	//讀入位圖數(shù)據(jù):
	m_Buffer=new BYTE[BufferSize];
	files.read((char *)m_Buffer,BufferSize);
	if(m_BmpInfo->bmiHeader.biCompression!=BI_RGB)
	{
		Free();
		return FALSE;
	}
	if(!CreatePalette())
	{
		Free();
		return FALSE;
	}
	m_BmpLoaded=TRUE;
	return TRUE;
}

//將內(nèi)存中的位圖存入文件:
BOOL CDib::SaveBmp(LPCTSTR fn)
{
	if(fn=="")
	{
		return FALSE;
	}
	if(!m_BmpLoaded)
	{
		return FALSE;
	}
	if(m_BmpInfo==0||m_Buffer==0)
	{
		return FALSE;
	}

//1. 更改m_BmpInfo->bmiHeader.biSizeImage:
	//1. biSizeImage=位圖數(shù)據(jù)的大小:
	m_BmpInfo->bmiHeader.biSizeImage=BufferSize;

//2. 填充bmpfh結(jié)構(gòu);
	BITMAPFILEHEADER bmpfh;
	memset(&bmpfh,0,sizeof(BITMAPFILEHEADER));
	bmpfh.bfType=BmpMarker;
	//bmpfh.bfSize=BITMAPFILEHEADER+BITMAPINFO+調(diào)色板+BufferSize:
	bmpfh.bfSize=sizeof(BITMAPFILEHEADER)+
			       sizeof(BITMAPINFO)+
		           (NumberOfColors-1)*sizeof(RGBQUAD)+
				   BufferSize;

	bmpfh.bfReserved1=0;
	bmpfh.bfReserved2=0;
	bmpfh.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+
		              m_BmpInfo->bmiHeader.biSize+
					  PaletteSize();
//3. 寫文件:
	FILE * fp;
	size_t sz;
	if((fp=fopen(fn,"wb"))==NULL)
	{
		return FALSE;
	}
	//1). 寫入BITMAPFILEHEADER:
	sz=fwrite((void *)&bmpfh,sizeof(BITMAPFILEHEADER),1,fp);
	if(sz!=1)
	{
		fclose(fp);
		return FALSE;
	}
	//2). 寫入BITMAPINFO:
	sz=fwrite((void *)m_BmpInfo,sizeof(BITMAPINFO)+(NumberOfColors-1)*sizeof(RGBQUAD),1,fp);
	if(sz!=1)
	{
		fclose(fp);
		return FALSE;
	}
	//3). 寫入位圖數(shù)據(jù):
	sz=fwrite(m_Buffer,1,BufferSize,fp);
	if(sz!=BufferSize)
	{
		fclose(fp);
		return FALSE;
	}
	fclose(fp);
	return TRUE;
}

//獲取位圖內(nèi)存地址:
BYTE * CDib::GetBuffer()
{
	return m_Buffer;
}

//根據(jù)像素在位圖中的位置求像素在內(nèi)存中的地址:
BYTE * CDib::FindPos(DWORD x, DWORD y)
{
	BYTE * pos;
	if(!m_BmpLoaded)
	{
		return 0;
	}
	pos=m_Buffer+Bpl*(Height-1-y)+x*BPP/8;
	return pos;
}

//將位圖的子畫面存入文件:
BOOL CDib::PickBitmapToFile(LPCTSTR fn, DWORD xt, DWORD yt, 
							DWORD xb, DWORD yb)
{
	BYTE * buf;
	DWORD w,h,bpl,bufsize,n0;
	if(!m_BmpLoaded)
	{
		return FALSE;
	}

	if(m_BmpInfo==0||m_Buffer==0)
	{
		return FALSE;
	}

	if(fn=="")
	{
		return FALSE;
	}

//1. 計(jì)算基本參數(shù):
	Sort(xt,xb);
	Sort(yt,yb);
	if(xt>Width)
	{
		return FALSE;
	}
	if(yt>Width)
	{
		return FALSE;
	}
	if(xb>Width)
	{
		xb=Width;
	}
	if(yb>Height)
	{
		yb=Height;
	}
	w=xb-xt;//子畫面寬度;
	h=yb-yt;//子畫面高度;
	bpl=(w*(BPP/8)+3)&~3;//每一行大小;
	n0=bpl-w*BPP/8;//需要在每一行末尾添加的0的數(shù)目;
	bufsize=bpl*h;//位圖數(shù)據(jù)區(qū)大小;

//2. 填寫位圖區(qū):
	BYTE * pos,* bufpos;
	pos=FindPos(xt,yt);//找到(xt,yt)像素在內(nèi)存中的位置;
	buf=new BYTE[bufsize];
	memset((void *)buf,0,bufsize);
	UINT i;
	bufpos=buf+bpl*(h-1);
	for(i=0;i<h;i++)
	{
		memcpy(bufpos,pos,w*BPP/8);
		bufpos-=bpl;
		pos-=Bpl;
	}

//3. 填寫位圖結(jié)構(gòu):
	BITMAPFILEHEADER fh;
	BITMAPINFO       info;
	memset(&fh  ,0,sizeof(BITMAPFILEHEADER));
	memset(&info,0,sizeof(BITMAPINFO));
	//1. 填充BITMAPINFO結(jié)構(gòu):
	info.bmiHeader.biBitCount=(WORD)BPP;
	info.bmiHeader.biClrImportant=m_BmpInfo->bmiHeader.biClrImportant;
	info.bmiHeader.biClrUsed=m_BmpInfo->bmiHeader.biClrUsed;
	info.bmiHeader.biCompression=BI_RGB;
	info.bmiHeader.biHeight=h;
	info.bmiHeader.biPlanes=m_BmpInfo->bmiHeader.biPlanes;
	info.bmiHeader.biSize=m_BmpInfo->bmiHeader.biSize;
	info.bmiHeader.biSizeImage=bufsize;
	info.bmiHeader.biWidth=w;
	info.bmiHeader.biXPelsPerMeter=m_BmpInfo->bmiHeader.biXPelsPerMeter;
	info.bmiHeader.biYPelsPerMeter=m_BmpInfo->bmiHeader.biYPelsPerMeter;
	info.bmiColors[0]=m_BmpInfo->bmiColors[0];
	//2. 填充bmpfh結(jié)構(gòu);
	fh.bfType=BmpMarker;
	//bmpfh.bfSize=BITMAPFILEHEADER+BITMAPINFO+調(diào)色板+BufferSize:
	fh.bfSize=sizeof(BITMAPFILEHEADER)+
			       sizeof(BITMAPINFO)+
		           (NumberOfColors-1)*sizeof(RGBQUAD)+
				   bufsize;

	fh.bfReserved1=0;
	fh.bfReserved2=0;
	fh.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+
		              m_BmpInfo->bmiHeader.biSize+
					  PaletteSize();
//4. 寫文件:
	FILE * fp;
	if((fp=fopen(fn,"wb"))==NULL)
	{
		return FALSE;
	}
	//1). 寫入BITMAPFILEHEADER:
	fwrite((char *)&fh,sizeof(BITMAPFILEHEADER),1,fp);
	//2). 寫入BITMAPINFOHEADER部分:
	fwrite((char *)&info.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
	//3). //寫入彩色表部分:
	if(BPP<16)
	{
		fwrite((char *)&m_Quad[0],NumberOfColors*sizeof(RGBQUAD),1,fp);
	}
	//4). 寫入位圖數(shù)據(jù):
	fwrite((char *)buf,bufsize,1,fp);
	delete buf;
	fclose(fp);
	return TRUE;
}	

void CDib::CalBmpData()
{
	if(m_BmpInfo==0)
	{
		return;
	}
//1. 位圖寬度(像素):
	Width=m_BmpInfo->bmiHeader.biWidth;
//位圖高度(像素):
	Height=m_BmpInfo->bmiHeader.biHeight;
//位圖色彩深度:
	BPP=m_BmpInfo->bmiHeader.biBitCount;
//位圖每一行占據(jù)的字節(jié)數(shù):
	Bpl=(Width*(BPP/8)+3)&~3;
//位圖數(shù)據(jù)區(qū)尺寸(字節(jié)):
	BufferSize=Bpl*Height;
//為m_Quad分配內(nèi)存:
	//如果色彩數(shù)目大于8 則返回:
	if(m_BmpInfo->bmiHeader.biBitCount>=16||
	   m_BmpInfo->bmiHeader.biBitCount<8)
	{
		NumberOfColors=0;
		return;
	}

	if(m_BmpInfo->bmiHeader.biClrUsed==0)
	{
		NumberOfColors=256;
	}
	else
	{
		NumberOfColors=m_BmpInfo->bmiHeader.biClrUsed;
	}
	m_Quad=new RGBQUAD[NumberOfColors];
	for(DWORD i=0;i<NumberOfColors;i++)
	{
		m_Quad[i]=m_BmpInfo->bmiColors[i];
	}
}

void CDib::SetBmpMarker(DWORD b, DWORD m)
{
	BmpMarker=(WORD)((m<<8)|b);
}

DWORD CDib::PaletteSize()
{
	if (m_BmpInfo==0)
	{
		return 0;
	}
	return (DWORD)NumberOfColors*sizeof(RGBQUAD);
}

BOOL CDib::CreatePalette()
{
	if (m_BmpInfo==0)
	{
		return FALSE;
	}
	if(BPP>=16)
	{
		return TRUE;
	}

	DWORD i;
	LPLOGPALETTE lpPal = (LPLOGPALETTE) new BYTE[sizeof(LOGPALETTE) + sizeof(PALETTEENTRY)*NumberOfColors];
	if (lpPal == 0)
	{
		return FALSE;
	}

	lpPal->palVersion = PALVERSION;
	lpPal->palNumEntries = (WORD)NumberOfColors;
	for (i=0;i<NumberOfColors;i++)
	{
		lpPal->palPalEntry[i].peRed   = m_Quad[i].rgbRed;
		lpPal->palPalEntry[i].peGreen = m_Quad[i].rgbGreen;
		lpPal->palPalEntry[i].peBlue  = m_Quad[i].rgbBlue;
		lpPal->palPalEntry[i].peFlags = 0;
	}

	if (m_hPal)
	{
		::DeleteObject((HGDIOBJ)m_hPal);
	}
	m_hPal=::CreatePalette(lpPal);
	if(!m_hPal)
	{
		return FALSE;
	}

	delete [] lpPal;
	return TRUE;
}

BOOL CDib::Draw(HDC hDC, LPRECT rcDest, LPRECT rcSrc)
{
	if (!m_BmpLoaded)
	{
		return FALSE;
	}

	HPALETTE hOldPal = 0;

	if (m_hPal!=0)
	{
		hOldPal = ::SelectPalette(hDC,m_hPal,TRUE);
	}

	::SetStretchBltMode(hDC, COLORONCOLOR);

	BOOL Ok;
	if ((RECTWIDTH(rcDest)  == RECTWIDTH(rcSrc)) &&
	    (RECTHEIGHT(rcDest) == RECTHEIGHT(rcSrc)))
	{
		Ok = ::SetDIBitsToDevice(hDC,                                 // hDC
								 rcDest->left,                        // DestX
								 rcDest->top,                         // DestY
								 RECTWIDTH(rcDest),                   // nDestWidth
								 RECTHEIGHT(rcDest),                  // nDestHeight
								 rcSrc->left,                         // SrcX
								 Height-rcSrc->top -RECTHEIGHT(rcSrc),// SrcY
								 0,                                   // nStartScan
								 (WORD)Height,                        // nNumScans
								 m_Buffer,                            // lpBits
								 m_BmpInfo,                           // lpBitsInfo
								 DIB_RGB_COLORS);                     // wUsage
	}
   else
   {
	  Ok = ::StretchDIBits(hDC,                            // hDC
							   rcDest->left,               // DestX
							   rcDest->top,                // DestY
							   RECTWIDTH(rcDest),          // nDestWidth
							   RECTHEIGHT(rcDest),         // nDestHeight
							   rcSrc->left,                // SrcX
							   rcSrc->top,                 // SrcY
							   RECTWIDTH(rcSrc),           // wSrcWidth
							   RECTHEIGHT(rcSrc),          // wSrcHeight
							   m_Buffer,                   // lpBits
							   m_BmpInfo,                   // lpBitsInfo
							   DIB_RGB_COLORS,             // wUsage
							   SRCCOPY);                   // dwROP
   }
	if (hOldPal != 0)
	{
		::SelectPalette(hDC, hOldPal, TRUE);
	}
   return Ok;
}

void CDib::Sort(DWORD &x0, DWORD &x1)
{
	DWORD t;
	if(x0>x1)
	{
		t=x1;
		x1=x0;
		x0=t;
	}
}

BITMAPINFOHEADER CDib::GetImageInfo(LPCTSTR fn, DWORD &w, DWORD &h)
{
	BITMAPFILEHEADER bmpfilehdr;
	BITMAPINFOHEADER bmpinfohdr;
	w=0;
	h=0;
	memset(&bmpfilehdr,0,sizeof(BITMAPFILEHEADER));
	memset(&bmpinfohdr,0,sizeof(BITMAPINFOHEADER));

	ifstream file( fn, ios::binary | ios::nocreate );
	if (!file.is_open())
	{
		return bmpinfohdr;
	}

	file.read( (char*)&bmpfilehdr, sizeof(bmpfilehdr) );

	if (bmpfilehdr.bfType!=(WORD)BmpMarker)
	{
		return bmpinfohdr;
	}

	file.read( (char*)&bmpinfohdr, sizeof(bmpinfohdr) );

	w=bmpinfohdr.biWidth;
	h=bmpinfohdr.biHeight;

	return bmpinfohdr;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
人禽交欧美网站| 国产精品一二三| 国产精品美日韩| 日韩一级免费一区| 色综合久久久久网| 成人综合在线网站| 久久国产精品99久久久久久老狼 | 日韩成人av影视| 国产精品美女久久久久久2018| 欧美一级免费大片| 欧美性色aⅴ视频一区日韩精品| 国产激情一区二区三区四区 | 中文字幕精品在线不卡| 欧美一区二区视频免费观看| 色噜噜狠狠色综合中国| 成人激情视频网站| 国产东北露脸精品视频| 美女视频黄 久久| 日精品一区二区| 亚洲成人激情自拍| 一区二区三区免费| 亚洲日本va午夜在线影院| 久久精品夜夜夜夜久久| 2021中文字幕一区亚洲| 欧美成人a∨高清免费观看| 欧美精品丝袜久久久中文字幕| 在线影视一区二区三区| 一本大道久久a久久综合| 99久久99久久精品免费看蜜桃| 国产精品一级片| 国产iv一区二区三区| 粉嫩av亚洲一区二区图片| 国产成人h网站| 国产精品白丝av| 成人网页在线观看| 99国产精品久久久| 色综合久久久久综合体桃花网| 97超碰欧美中文字幕| 91视频www| 在线观看三级视频欧美| 欧美吻胸吃奶大尺度电影| 欧美日韩黄色一区二区| 5858s免费视频成人| 日韩一区二区三区四区| 精品久久国产97色综合| 久久九九全国免费| 中文字幕巨乱亚洲| 亚洲免费观看高清完整| 亚洲图片欧美综合| 日韩av在线发布| 国产裸体歌舞团一区二区| 成人精品视频一区二区三区尤物| 91丨porny丨在线| 欧美撒尿777hd撒尿| 91精品国产色综合久久不卡蜜臀| 精品蜜桃在线看| 欧美国产一区视频在线观看| 日韩毛片精品高清免费| 亚洲一区二区三区在线播放| 日韩精品一区第一页| 国产一区二区三区黄视频| 99久久国产综合精品女不卡| 欧美日韩一区成人| 久久久一区二区| 亚洲综合在线电影| 美女诱惑一区二区| 北岛玲一区二区三区四区| 欧美日韩情趣电影| 国产欧美日韩视频一区二区| 夜夜爽夜夜爽精品视频| 蜜臀va亚洲va欧美va天堂 | 亚洲欧美激情在线| 91浏览器在线视频| 精品国产电影一区二区| 久久精品在这里| 亚洲免费av观看| 久久国产精品99久久久久久老狼| 成人在线综合网| 欧美日韩三级视频| 亚洲国产高清不卡| 午夜视频久久久久久| 国产成人啪午夜精品网站男同| 色综合久久久久久久| 精品久久人人做人人爽| 亚洲欧美福利一区二区| 久久99久久久欧美国产| 欧美亚洲一区三区| 国产亚洲欧美日韩日本| 亚洲成人免费av| 国产 日韩 欧美大片| 91精品在线免费| 1区2区3区欧美| 国产综合色产在线精品 | 91久久人澡人人添人人爽欧美| 制服丝袜亚洲网站| 亚洲欧美日韩在线播放| 国产综合色精品一区二区三区| 欧美性色aⅴ视频一区日韩精品| 国产午夜一区二区三区| 天天色综合天天| 91丨porny丨中文| 国产亚洲精品bt天堂精选| 日韩中文字幕区一区有砖一区| jlzzjlzz国产精品久久| 精品国产成人系列| 天堂在线亚洲视频| 91女厕偷拍女厕偷拍高清| 久久精品一二三| 美国三级日本三级久久99| 欧美日韩另类国产亚洲欧美一级| 久久精品视频一区| 久久国产精品99久久久久久老狼 | 国产美女av一区二区三区| 欧美精品丝袜中出| 亚洲午夜精品网| 91成人免费在线视频| 一区二区中文字幕在线| 国产成人精品免费网站| 久久婷婷综合激情| 韩国女主播成人在线| 日韩欧美亚洲国产另类| 美女在线视频一区| 日韩欧美国产一区二区在线播放| 婷婷六月综合亚洲| 在线不卡免费欧美| 免费成人在线视频观看| 欧美一区二区三区四区久久| 五月婷婷综合在线| 91麻豆精品国产无毒不卡在线观看| 亚洲国产成人高清精品| 欧美日韩精品福利| 水蜜桃久久夜色精品一区的特点| 一本一道久久a久久精品| 亚洲美女屁股眼交| 在线免费观看日韩欧美| 亚洲国产精品视频| 欧美男女性生活在线直播观看| 日韩在线观看一区二区| 正在播放一区二区| 老司机精品视频一区二区三区| 精品成人在线观看| 国产美女精品在线| 亚洲欧洲日韩av| 日本高清不卡视频| 亚洲大片精品永久免费| 欧美一区二区三区在线观看| 激情小说欧美图片| 国产精品色婷婷久久58| 91玉足脚交白嫩脚丫在线播放| 亚洲已满18点击进入久久| 欧美二区在线观看| 精品写真视频在线观看| 中文在线资源观看网站视频免费不卡 | 亚洲图片另类小说| 在线观看视频一区| 奇米影视在线99精品| 久久免费看少妇高潮| jlzzjlzz欧美大全| 亚洲福利一二三区| 精品国产免费人成电影在线观看四季| 国产成人一区二区精品非洲| 亚洲免费观看高清完整版在线观看| 欧美日韩一区不卡| 国产一区 二区| 艳妇臀荡乳欲伦亚洲一区| 日韩欧美aaaaaa| 99久久精品免费看| 日本成人中文字幕在线视频| 国产欧美在线观看一区| 在线日韩一区二区| 国产一区二区三区日韩| 亚洲男人天堂av| 日韩女优视频免费观看| 99re这里只有精品6| 免费视频最近日韩| 中文字幕一区二区三区在线播放 | 欧美嫩在线观看| 高清不卡在线观看av| 天堂在线亚洲视频| 国产精品免费aⅴ片在线观看| 欧美日韩不卡一区二区| 成人av资源在线观看| 免费人成黄页网站在线一区二区 | 综合久久久久久久| 日韩写真欧美这视频| 色综合久久六月婷婷中文字幕| 久久99精品一区二区三区| 亚洲黄色性网站| 国产日韩欧美综合一区| 欧美另类z0zxhd电影| 91丝袜美女网| 国产乱理伦片在线观看夜一区| 亚洲成a人v欧美综合天堂| 国产精品三级在线观看| 精品欧美乱码久久久久久| 欧美视频一区在线观看| www.99精品| 国产999精品久久| 韩国女主播一区二区三区| 亚洲成人tv网|