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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cdib.cpp

?? 采用DPCM壓縮算法的工程文件
?? CPP
?? 第 1 頁 / 共 3 頁
字號:

		// 如果文件類型部位"BM",則返回并進行相應錯誤處理
		if(bmfh.bfType != 0x4d42) {
//			throw new CException;
		}

		// 計算信息頭加上調色板的大小,并分配相應的內存
		nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
		m_lpBMIH = (LPBITMAPINFOHEADER) new char[nSize];
		m_nBmihAlloc = crtAlloc;
		m_nImageAlloc = noAlloc;

		// 讀取信息頭和調色板
		nCount = pFile->Read(m_lpBMIH, nSize); 

		// 如果圖象為壓縮格式,則不進行后續處理
		if(m_lpBMIH->biCompression != BI_RGB) {
//			throw new CException;
		}

		// 計算圖象數據大小并設置調色板指針
		ComputeMetrics();

		// 計算調色板的表項數
		ComputePaletteSize(m_lpBMIH->biBitCount);

		// 如果DIB中存在調色板,則創建一個Windows調色板
		MakePalette();

		// 將CDib對象的邏輯調色板選入設備上下文		
		UsePalette(pDC);

		// 創建一個DIB段,并分配圖象內存
		m_hBitmap = ::CreateDIBSection(pDC->GetSafeHdc(), (LPBITMAPINFO) m_lpBMIH,
			DIB_RGB_COLORS,	(LPVOID*) &m_lpImage, NULL, 0);
		ASSERT(m_lpImage != NULL);

		// 從文件中讀取圖象數據
		nCount = pFile->Read(m_lpImage, m_dwSizeImage); 
	}

	// 錯誤處理
	catch(CException* pe) {
		AfxMessageBox("ReadSection error");
		pe->Delete();
		return FALSE;
	}
	return TRUE;
}


/*************************************************************************
 *
 * \函數名稱:
 *   Write()
 *
 * \輸入參數:
 *   CFile*	pFile			- 指向CFile對象的指針
 *
 * \返回值:
 *   BOOL				- 如果成功,則返回TRUE
 *
 * \說明:
 *   該函數把DIB從CDib對象寫進文件中。該文件必須成功打開或者創建
 *
 ************************************************************************
 */
BOOL CDib::Write(CFile* pFile)
{
	BITMAPFILEHEADER bmfh;

	// 設置文件頭中文件類型為"BM"
	bmfh.bfType = 0x4d42;  

	// 計算信息頭和調色板的大小尺寸
	int nSizeHdr = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;

	// 設置文件頭信息
	bmfh.bfSize = sizeof(BITMAPFILEHEADER) + nSizeHdr + m_dwSizeImage;
	bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
	bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
			sizeof(RGBQUAD) * m_nColorTableEntries;	
	
	// 進行寫操作
	try {
		pFile->Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
		pFile->Write((LPVOID) m_lpBMIH,  nSizeHdr);
		pFile->Write((LPVOID) m_lpImage, m_dwSizeImage);
	}

	// 錯誤處理
	catch(CException* pe) {
		pe->Delete();
		AfxMessageBox("write error");
		return FALSE;
	}

	// 返回
	return TRUE;
}


/*************************************************************************
 *
 * \函數名稱:
 *   Serialize()
 *
 * \輸入參數:
 *   CArchive&	ar			- 指向應用程序歸檔對象
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數進行串行化過程,將CDib數據進行讀入或者寫出
 *
 ************************************************************************
 */
void CDib::Serialize(CArchive& ar)
{
	DWORD dwPos;

	// 獲得此歸檔文件的CFile對象指針
	dwPos = ar.GetFile()->GetPosition();
	TRACE("CDib::Serialize -- pos = %d\n", dwPos);

	// 從歸檔文件緩沖區中沖掉未寫入數據
	ar.Flush();

	// 重新獲得此歸檔文件的CFile對象指針
	dwPos = ar.GetFile()->GetPosition();
	TRACE("CDib::Serialize -- pos = %d\n", dwPos);

	// 確定歸檔文件是否被存儲,是則進行存儲	
	if(ar.IsStoring()) {
		Write(ar.GetFile());
	}

	// 否則進行加載
	else {
		Read(ar.GetFile());
	}
}


/*************************************************************************
 *
 * \函數名稱:
 *   ComputePaletteSize()
 *
 * \輸入參數:
 *   int	nBitCount		- 指向CFile對象的指針
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數根據位圖象素位數計算調色板的尺寸
 *
 ************************************************************************
 */
void CDib::ComputePaletteSize(int nBitCount)
{
	// 如果biClrUsed為零,則用到的顏色數為2的biBitCount次方
	if((m_lpBMIH == NULL) || (m_lpBMIH->biClrUsed == 0)) {
		switch(nBitCount) {
			case 1:
				m_nColorTableEntries = 2;
				break;
			case 4:
				m_nColorTableEntries = 16;
				break;
			case 8:
				m_nColorTableEntries = 256;
				break;
			case 16:
			case 24:
			case 32:
				m_nColorTableEntries = 0;
				break;
			default:
				ASSERT(FALSE);
		}
	}

	// 否則調色板的表項數就是用到的顏色數目
	else {
		m_nColorTableEntries = m_lpBMIH->biClrUsed;
	}

	ASSERT((m_nColorTableEntries >= 0) && (m_nColorTableEntries <= 256)); 
}


/*************************************************************************
 *
 * \函數名稱:
 *   ComputeMetrics()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數計算圖象位圖的尺寸,并對DIB中的調色板的指針進行賦值
 *
 ************************************************************************
 */
void CDib::ComputeMetrics()
{
	// 如果結構的長度不對,則進行錯誤處理
	if(m_lpBMIH->biSize != sizeof(BITMAPINFOHEADER)) {
		TRACE("Not a valid Windows bitmap -- probably an OS/2 bitmap\n");
//		throw new CException;
	}

	// 保存圖象數據內存大小到CDib對象的數據成員中
	m_dwSizeImage = m_lpBMIH->biSizeImage;

	// 如果圖象數據內存大小為0,則重新計算
	if(m_dwSizeImage == 0) {
		DWORD dwBytes = ((DWORD) m_lpBMIH->biWidth * m_lpBMIH->biBitCount) / 32;
		if(((DWORD) m_lpBMIH->biWidth * m_lpBMIH->biBitCount) % 32) {
			dwBytes++;
		}
		dwBytes *= 4;
		m_dwSizeImage = dwBytes * m_lpBMIH->biHeight;	
	}

	// 設置DIB中的調色板指針
	m_lpvColorTable = (LPBYTE) m_lpBMIH + sizeof(BITMAPINFOHEADER);
}


/*************************************************************************
 *
 * \函數名稱:
 *   Empty()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   該函數清空DIB,釋放已分配的內存,并且必要的時候關閉映射文件
 *
 ************************************************************************
 */
void CDib::Empty()
{
	// 關閉內存映射文件的連接
	DetachMapFile();

	// 根據內存分配的狀態,調用相應的函數釋放信息頭
	if(m_nBmihAlloc == crtAlloc) {
		delete [] m_lpBMIH;
	}
	else if(m_nBmihAlloc == heapAlloc) {
		::GlobalUnlock(m_hGlobal);
		::GlobalFree(m_hGlobal);
	}

	// 釋放圖象數據內存
	if(m_nImageAlloc == crtAlloc) delete [] m_lpImage;

	// 釋放調色板句柄
	if(m_hPalette != NULL) ::DeleteObject(m_hPalette);

	// 如果創建了BITMAP,則進行釋放
	if(m_hBitmap != NULL) ::DeleteObject(m_hBitmap);

	// 重新設置內存分配狀態
	m_nBmihAlloc = m_nImageAlloc = noAlloc;

	// 釋放內存后,還需要將指針設置為NULL并將相應的數據設置為0
	m_hGlobal = NULL;
	m_lpBMIH = NULL;
	m_lpImage = NULL;
	m_lpvColorTable = NULL;
	m_nColorTableEntries = 0;
	m_dwSizeImage = 0;
	m_lpvFile = NULL;
	m_hMap = NULL;
	m_hFile = NULL;
	m_hBitmap = NULL;
	m_hPalette = NULL;
}


/*************************************************************************
 *
 * \函數名稱:
 *   DetachMapFile()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   無
 *
 * \說明:
 *   函數可以釋放現有的已分配的內存,并關閉以前關聯的任何內存映射文件。
 *
 ************************************************************************
 */
void CDib::DetachMapFile()
{
	// 如果沒有進行內存映射,則不進行處理
	if(m_hFile == NULL) return;

	// 關閉內存映射
	::UnmapViewOfFile(m_lpvFile);

	// 關閉內存映射對象和文件
	::CloseHandle(m_hMap);
	::CloseHandle(m_hFile);
	m_hFile = NULL;
}


/*************************************************************************
 *
 * \函數名稱:
 *   PaletteSize()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   DWORD				- 返回調色板的尺寸
 *
 * \說明:
 *   該函數計算機調色板所需的尺寸
 *
 ************************************************************************
 */
WORD CDib::PaletteSize()
{
	// 臨時變量
	WORD	       NumColors;
	LPBITMAPINFOHEADER lpbi=m_lpBMIH;

	// 如果biClrUsed為零,且圖象象素位數小于8,則計算調色板用到的表項數
	NumColors = 	((lpbi)->biClrUsed == 0 && (lpbi)->biBitCount <= 8 \
                                    ? (int)(1 << (int)(lpbi)->biBitCount)          \
                                    : (int)(lpbi)->biClrUsed);

	// 根據顏色表示的字節數計算調色板的尺寸
	if (lpbi->biSize == sizeof(BITMAPCOREHEADER))
		return NumColors * sizeof(RGBTRIPLE);
	else 
		return NumColors * sizeof(RGBQUAD);

}


/*************************************************************************
 *
 * \函數名稱:
 *   IsEmpty()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   BOOL				- 如果信息頭和圖象數據為空,則返回TRUE
 *
 * \說明:
 *   判斷信息頭和圖象數據是否為空
 *
 ************************************************************************
 */
BOOL CDib::IsEmpty()
{

	if(	m_lpBMIH == NULL&&m_lpImage == NULL)
		return TRUE;
	else
		return FALSE;

}


/*************************************************************************
 *
 * \函數名稱:
 *   GetDibSaveDim()
 *
 * \輸入參數:
 *   無
 *
 * \返回值:
 *   CSize			- DIB實際存儲的高度和寬度
 *
 * \說明:
 *   該函數函數用來得到dib的實際存儲寬度(DWORD對齊)
 *
 ************************************************************************
 */

CSize CDib::GetDibSaveDim()
{
	CSize sizeSaveDim;
	sizeSaveDim.cx	= ( m_lpBMIH->biWidth * m_lpBMIH->biBitCount + 31)/32 * 4;
	sizeSaveDim.cy	= m_lpBMIH->biHeight; 
	return sizeSaveDim;

}


/*************************************************************************
 *
 * \函數名稱:
 *   GetPixelOffset()
 *
 * \輸入參數:
 *   int	x		- 象素在X軸的坐標
 *   int	y		- 象素在Y軸的坐標
 *
 * \返回值:
 *   int			- 返回象素在圖象數據塊中的真實地址
 *
 * \說明:
 *   該函數得到坐標為(x,y)的象素點的真實地址。由于DIB結構中對圖象數據排列的
 *   方式為從下到上,從左到右的,所以需要進行轉換。
 *
 ************************************************************************
 */
LONG CDib::GetPixelOffset(int  x, int y)
{
	CSize sizeSaveDim;
	sizeSaveDim = GetDibSaveDim();

	LONG lOffset = (LONG) (sizeSaveDim.cy - y - 1) * sizeSaveDim.cx +
		x  / (8 / m_lpBMIH->biBitCount);
	return lOffset;
}


/*************************************************************************
 *
 * \函數名稱:
 *   GetPixel()
 *
 * \輸入參數:
 *   int	x		- 象素在X軸的坐標
 *   int	y		- 象素在Y軸的坐標
 *
 * \返回值:
 *   RGBQUAD			- 返回DIB在該點真實的顏色
 *
 * \說明:
 *   該函數得到DIB圖象在該點真是的顏色。
 *
 ************************************************************************
 */
RGBQUAD CDib::GetPixel(int x, int y)
{
	// 顏色結構
	RGBQUAD cColor;
	
	// 根據每象素比特數得到此點的象素值
	switch (m_lpBMIH->biBitCount)
	{
		case 1 :
			if (1<<(7-x%8) & *(LPBYTE)(m_lpImage+GetPixelOffset(x, y)))
			{			
				cColor.rgbBlue  = 255;
				cColor.rgbGreen = 255;
				cColor.rgbRed   = 255;
				cColor.rgbReserved =0;
			}
			else
			{			
				cColor.rgbBlue  = 0;
				cColor.rgbGreen = 0;
				cColor.rgbRed   = 0;	
				cColor.rgbReserved =0;
			}
			break;
		case 4 :	
			{
				int nIndex = (*(LPBYTE)(m_lpImage+GetPixelOffset(x, y)) & 
							   (x%2 ? 0x0f : 0xf0)) >> (x%2 ? 0 : 4);
				LPRGBQUAD pDibQuad = (LPRGBQUAD) (m_lpvColorTable) + nIndex;
				cColor.rgbBlue  = pDibQuad->rgbBlue;
				cColor.rgbGreen = pDibQuad->rgbGreen;
				cColor.rgbRed   = pDibQuad->rgbRed;
				cColor.rgbReserved =0;
			}
					break;
		case 8 :	
			{
				int nIndex = *(BYTE*)(m_lpImage+GetPixelOffset(x, y));
				LPRGBQUAD pDibQuad = (LPRGBQUAD) (m_lpvColorTable) + nIndex;
				cColor.rgbBlue  = pDibQuad->rgbBlue;
				cColor.rgbGreen = pDibQuad->rgbGreen;
				cColor.rgbRed   = pDibQuad->rgbRed;
				cColor.rgbReserved =0;
			}
					break;
		default:
				int nIndex = *(BYTE*)(m_lpImage+GetPixelOffset(x, y));					
				cColor.rgbRed   = m_lpImage[nIndex];
				cColor.rgbGreen = m_lpImage[nIndex + 1];
				cColor.rgbBlue  = m_lpImage[nIndex + 2];
				cColor.rgbReserved =0;	
				break;
	}

	// 返回顏色結構
	return cColor;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩中文字幕不卡| 国产专区综合网| 亚洲精品在线观看网站| 91在线播放网址| 国产一区二区在线观看视频| 亚洲一二三四区不卡| 国产精品美女久久久久久久久 | 欧美美女喷水视频| 国产高清精品久久久久| 亚洲18女电影在线观看| 专区另类欧美日韩| 久久久久久久久久美女| 日韩欧美国产小视频| 欧美日韩免费一区二区三区| av在线一区二区三区| 国产伦精一区二区三区| 六月丁香综合在线视频| 天堂久久一区二区三区| 亚洲图片欧美一区| 伊人性伊人情综合网| 亚洲视频在线观看三级| 国产精品免费久久| 欧美激情综合五月色丁香小说| 精品国偷自产国产一区| 欧美一级精品大片| 日韩一卡二卡三卡四卡| 欧美肥胖老妇做爰| 91麻豆精品国产自产在线| 精品视频免费看| 91国模大尺度私拍在线视频| 91在线观看成人| 色伊人久久综合中文字幕| 97久久久精品综合88久久| aaa亚洲精品| 99久久久久久| 91欧美一区二区| 色婷婷av一区二区三区大白胸| 精品91自产拍在线观看一区| 精品欧美黑人一区二区三区| 精品国产电影一区二区| 欧美成人r级一区二区三区| 欧美电视剧在线看免费| 精品电影一区二区| 久久久久久一级片| 中文字幕av一区二区三区| 国产精品拍天天在线| 亚洲视频狠狠干| 亚洲一区中文在线| 日本大胆欧美人术艺术动态| 狠狠色丁香婷婷综合| 国产福利一区二区| 91视频在线观看免费| 欧美日韩一级片网站| 日韩欧美在线网站| 欧美激情一区在线| 伊人性伊人情综合网| 日本亚洲天堂网| 国产精品一二三区| 99国产精品国产精品久久| 欧美中文一区二区三区| 91精品国产欧美一区二区18| 久久嫩草精品久久久精品一| 中文字幕在线观看不卡视频| 一区二区三区不卡视频在线观看 | 亚洲日本一区二区三区| 一区二区国产视频| 日韩电影在线一区| 国产成人丝袜美腿| 在线精品亚洲一区二区不卡| 欧美精品tushy高清| 国产婷婷色一区二区三区在线| 亚洲色图在线播放| 另类小说视频一区二区| 99国产欧美久久久精品| 欧美精品日日鲁夜夜添| xf在线a精品一区二区视频网站| 综合在线观看色| 麻豆精品一区二区三区| 99麻豆久久久国产精品免费| 欧美精品tushy高清| 国产精品另类一区| 亚洲国产中文字幕在线视频综合| 精品一区二区免费视频| 色婷婷国产精品| 久久久久久久久久久电影| 亚洲欧美另类图片小说| 久久99久久99| 色八戒一区二区三区| 久久久另类综合| 丝袜美腿高跟呻吟高潮一区| 成+人+亚洲+综合天堂| 91精品国产综合久久久久久久久久| 国产日韩欧美电影| 免费黄网站欧美| 在线亚洲一区观看| 国产偷国产偷亚洲高清人白洁| 亚洲国产va精品久久久不卡综合| 国产成人精品亚洲午夜麻豆| 在线电影院国产精品| 国产精品护士白丝一区av| 久久99精品国产.久久久久 | 欧美aaa在线| 日本电影欧美片| 国产精品的网站| 国产麻豆精品95视频| 日韩午夜在线播放| 丝袜诱惑制服诱惑色一区在线观看| 不卡一区在线观看| 欧美极品美女视频| 激情都市一区二区| 91精品国产入口在线| 一区二区三区蜜桃网| 97se狠狠狠综合亚洲狠狠| 久久久久久久久久久黄色| 裸体歌舞表演一区二区| 91麻豆精品国产91久久久久久久久 | 日本网站在线观看一区二区三区| 91啪亚洲精品| 亚洲同性同志一二三专区| 成人免费视频播放| 国产香蕉久久精品综合网| 国产综合色在线视频区| 日韩欧美色综合| 蜜桃av噜噜一区二区三区小说| 欧美日韩视频不卡| 亚洲韩国精品一区| 欧美三级在线看| 亚洲午夜在线电影| 欧美日韩精品久久久| 亚洲va欧美va人人爽| 欧美日韩国产123区| 亚洲国产精品一区二区久久| 日本韩国欧美国产| 亚洲影视资源网| 欧美无乱码久久久免费午夜一区| 夜夜爽夜夜爽精品视频| 欧美在线观看你懂的| 亚洲第一久久影院| 欧美久久免费观看| 麻豆91在线看| 国产三区在线成人av| 91在线你懂得| 一区二区三区四区乱视频| 欧美三级电影网站| 日本人妖一区二区| 欧美mv和日韩mv的网站| 国产精品亚洲第一区在线暖暖韩国| 久久精品人人做人人爽97| 成人毛片视频在线观看| 亚洲三级在线观看| 欧美人与禽zozo性伦| 久久97超碰色| 国产精品免费免费| 欧美日韩国产大片| 韩国理伦片一区二区三区在线播放| 国产亚洲一本大道中文在线| 91一区二区三区在线播放| 亚洲一级片在线观看| 欧美电影免费观看高清完整版在线 | 亚洲一区二区在线视频| 欧美日韩成人一区二区| 久久99国产精品麻豆| 欧美激情一区二区三区蜜桃视频| 99久久综合国产精品| 亚洲国产成人av| 久久欧美一区二区| 91在线视频免费观看| 爽好久久久欧美精品| 久久久精品免费免费| 色女孩综合影院| 免播放器亚洲一区| 亚洲欧洲国产日韩| 欧美老肥妇做.爰bbww视频| 国产乱一区二区| 一区二区三区产品免费精品久久75| 91精品国产综合久久国产大片| 丁香另类激情小说| 免费成人在线播放| 亚洲美女区一区| 欧美精品一区二区精品网| 色一情一乱一乱一91av| 精品一区二区三区香蕉蜜桃 | 中文字幕一区二区三区在线观看| 欧美乱妇一区二区三区不卡视频| 成人污视频在线观看| 日韩成人一级大片| 亚洲老妇xxxxxx| 久久久亚洲欧洲日产国码αv| 在线观看91精品国产入口| 国产高清精品久久久久| 欧美96一区二区免费视频| 日韩一区在线免费观看| 欧美r级在线观看| 欧美中文字幕久久| 9色porny自拍视频一区二区| 麻豆91在线播放免费| 亚洲狠狠爱一区二区三区| 中文字幕一区二区视频| 久久综合国产精品| 欧美福利视频一区|