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

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

?? cdib.cpp

?? 可用的基于小波的spiht算法
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//cdib.cpp 

#include "StdAfx.h"
#include "cdib.h"



IMPLEMENT_SERIAL(CDib,CObject,0);
/***********************************************************
* \函數名稱:
*          CDib()
* \輸入參數:
*           無
* \返回值:
*           無
* \說明:
*        構造函數
*************************************************************
*/
CDib::CDib()
{
	m_hFile = NULL;
	m_hBitmap = NULL;
	m_hPalette = NULL;
	m_nBmihAlloc = m_nImageAlloc = noAlloc;
	Empty();
}

/***********************************************************
* \函數名稱:
*          CDib()
* \輸入參數:
*           CSize size   -位圖尺寸
*			int nBitCount -像素位數
* \返回值:
*           無
* \說明:
*        構造函數
*        根據給定尺寸和像素位數構造CDib對象,并對信息頭和調色板分配內存
*        但并沒有給位圖數據分配內存
************************************************************
*/
CDib::CDib(CSize size,int nBitCount)
{
	m_hFile = NULL;
	m_hBitmap = NULL;
	m_hPalette = NULL;
	m_nBmihAlloc = m_nImageAlloc = noAlloc;
	Empty();

	ComputePaletteSize(nBitCount);       //根據像素位數計算調色板尺寸
    //分配DIB信息頭和調色板的內存
	m_lpBMIH = (LPBITMAPINFOHEADER)new char[sizeof(BITMAPINFOHEADER) 
		+ sizeof(RGBQUAD) * m_nColorTableEntries];	
	m_nBmihAlloc = crtAlloc;            //設置信息頭內存分配狀態
	//設置信息頭中的信息
	m_lpBMIH->biSize = sizeof(BITMAPINFOHEADER);
	m_lpBMIH->biWidth = size.cx;
	m_lpBMIH->biHeight = size.cy;
	m_lpBMIH->biPlanes = 1;
	m_lpBMIH->biBitCount = nBitCount;
	m_lpBMIH->biCompression = BI_RGB;
	m_lpBMIH->biSizeImage = 0;
	m_lpBMIH->biXPelsPerMeter = 0;
	m_lpBMIH->biYPelsPerMeter = 0;
	m_lpBMIH->biClrUsed = m_nColorTableEntries;
	m_lpBMIH->biClrImportant = m_nColorTableEntries;

	ComputeMetrics();                  //計算圖像數據內存的大小,并設置DIB的調色板的指針
    //將此DIB的調色板初始化為0
	memset(m_lpvColorTable,0,sizeof(RGBQUAD) * m_nColorTableEntries);

	//暫時不分配圖像數據內存
	m_lpImage = NULL;
}

/***********************************************************
* \函數名稱:
*          ~CDib()
* \輸入參數:
*           無
* \返回值:
*           無
* \說明:
*        析構函數,并釋放所有分配的DIB內存
************************************************************
*/
CDib::~CDib()
{
	Empty();
}

/***********************************************************
* \函數名稱:
*          Read()
* \輸入參數:
*           CFile* pFile   -指向CFile對象的指針
* \返回值:
*         BOOL             -如果成功,則返回TRUE
* \說明:
*       該函數從一個文件讀入CDib對象,該文件必須成功打開。
*       如果該文件是BMP,讀取工作從文件頭開始;如果是一個文檔,讀取工作則從當前文件指針處開始
************************************************************
*/
BOOL CDib::Read(CFile* pFile)
{
	Empty();             //釋放已經分配的內存
	
	//臨時存放信息的變量
	int nCount,nSize;
	BITMAPFILEHEADER bmfh;

    //進行讀操作
	try
	{
		//讀取文件頭
		nCount = pFile->Read((LPVOID)&bmfh,sizeof(BITMAPFILEHEADER));
		if(nCount!=sizeof(BITMAPFILEHEADER)){
			throw new CException;
		}
		//如果文件類型部位"BM",則返回并進行相應錯誤處理
		if(bmfh.bfType!=0x4d42){
			throw new CException;
		}
		//計算信息頭加上調色板的大小,并分配內存
		nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
		m_lpBMIH = (LPBITMAPINFOHEADER)new char[nSize];
		m_nBmihAlloc=m_nImageAlloc=crtAlloc;

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

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

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

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

		//分配圖像數據內存,并從文件中讀取圖像數據
		m_lpImage = (LPBYTE)new char[m_dwSizeImage];
		nCount = pFile->Read(m_lpImage,m_dwSizeImage);
	}

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

/***********************************************************
* \函數名稱:
*          ReadSection()
* \輸入參數:
*           CFile* pFile   -指向CFile對象的指針,對應的磁盤文件中包含DIB
*           CDC* pDC       -設備上下文指針
* \返回值:
*         BOOL             -如果成功,則返回TRUE
* \說明:
*       該函數從BMP文件中讀取信息頭,調用CreateDIBSection來分配圖像內存,然后將圖像從該文件
*       讀入剛分配的內存。如果你想從磁盤讀取一個DIB,然后通過調用GDI函數編輯它的話,
*       可以使用該函數。你可以用Write或CopyToMapFile將DIB寫回到磁盤
************************************************************
*/
BOOL CDib::ReadSection(CFile* pFile,CDC* pDC/* = NULL*/)
{
	Empty();             //釋放已經分配的內存
	
	//臨時存放信息的變量
	int nCount,nSize;
	BITMAPFILEHEADER bmfh;

    //進行讀操作
	try
	{
		//讀取文件頭
		nCount = pFile->Read((LPVOID)&bmfh,sizeof(BITMAPFILEHEADER));
		if(nCount!=sizeof(BITMAPFILEHEADER)){
			throw new CException;
		}
		//如果文件類型部位"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("Read 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());
	}
}

/***********************************************************
* \函數名稱:
*          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;
}

/***********************************************************
* \函數名稱:
*          GetDimensions()
* \輸入參數:
*         無
* \返回值:
*         CSize         -DIB的高度和寬度
* \說明:
*       該函數返回以像素表示的dib的寬度和高度
************************************************************
*/
CSize CDib::GetDimensions()
{
	if(m_lpBMIH == NULL) return CSize(0,0);
	return CSize((int)m_lpBMIH->biWidth,(int)m_lpBMIH->biHeight);
}

/***********************************************************
* \函數名稱:
*          GetPixel()
* \輸入參數:
*         int x         -像素在X軸的坐標
*         int y         -像素在Y軸的坐標
* \返回值:
*         RGBQUAD       -返回DIB在該點真實的顏色
* \說明:
*       該函數得到DIB圖像在該點真實的顏色
************************************************************
*/
RGBQUAD CDib::GetPixel(int x, int y)
{
	RGBQUAD cColor;
	//CPalette* pPaletteTemp;
	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.rgbBlue = m_lpImage[nIndex];
		cColor.rgbGreen = m_lpImage[nIndex+1];
		cColor.rgbRed = m_lpImage[nIndex+2];
		cColor.rgbReserved = 0;
		break;
	}
	return cColor;
}

/***********************************************************
* \函數名稱:
*          GetPixelOffset()
* \輸入參數:
*         int x         -像素在X軸的坐標
*         int y         -像素在Y軸的坐標
* \返回值:
*         int           -返回像素在圖像數據塊中的真實地址
* \說明:
*       由于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;
}

/***********************************************************
* \函數名稱:
*          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
* \說明:
*       判斷信息頭和圖像數據是否為空
************************************************************
*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品粉嫩超白一线天av| 无吗不卡中文字幕| 国产精品一品二品| 久久久精品一品道一区| 精品一区二区在线视频| 久久久久久久精| 99久久精品国产导航| 一区二区三区色| 欧美日韩国产一区二区三区地区| 亚洲国产欧美日韩另类综合| 欧美一区二区视频免费观看| 另类小说图片综合网| 国产亚洲污的网站| www.亚洲人| 同产精品九九九| 久久―日本道色综合久久| 97久久精品人人澡人人爽| 亚洲一区二区三区爽爽爽爽爽| 欧美日韩精品电影| 国产麻豆精品95视频| 国产精品不卡一区二区三区| 欧美精品黑人性xxxx| 国产美女一区二区| 亚洲最大成人综合| 久久中文字幕电影| 欧美亚洲自拍偷拍| 国产精品456| 一区二区三区免费| 久久综合五月天婷婷伊人| 91麻豆国产福利精品| 免费看日韩a级影片| 中文字幕一区二区视频| 欧美男同性恋视频网站| 处破女av一区二区| 日本亚洲天堂网| 日韩毛片精品高清免费| 日韩精品一区二区三区中文精品 | 成人小视频免费在线观看| 一区二区三区欧美亚洲| 亚洲精品一区二区三区四区高清 | 一区二区三区国产精华| 日韩一区和二区| 91在线观看成人| 国产精品538一区二区在线| 午夜精品久久久久久久99水蜜桃| 国产欧美精品一区aⅴ影院 | 五月婷婷久久丁香| 国产精品嫩草久久久久| 欧美电视剧免费观看| 91黄色激情网站| 成人国产在线观看| 狠狠色狠狠色综合系列| 日韩激情视频网站| 亚洲人亚洲人成电影网站色| 精品成人在线观看| 欧美精品久久99| 欧美日韩专区在线| 91免费看视频| 成人av免费在线| 国产精品1区2区3区| 狂野欧美性猛交blacked| 亚洲v日本v欧美v久久精品| 亚洲人亚洲人成电影网站色| 中文字幕高清不卡| 国产无人区一区二区三区| 精品国产乱子伦一区| 日韩欧美一级精品久久| 欧美丰满嫩嫩电影| 最新日韩av在线| 中文字幕一区二区在线观看 | 国产精品天天摸av网| 成人性生交大片免费看在线播放| 亚洲裸体在线观看| 国产精品国产三级国产普通话蜜臀| 久久综合中文字幕| 欧美tickling挠脚心丨vk| 欧美一区二区不卡视频| 欧美精品日日鲁夜夜添| 欧美日韩国产高清一区| 欧美色老头old∨ideo| 欧美在线观看18| 欧美亚洲日本一区| 欧美日韩亚洲综合一区二区三区| 欧洲一区二区三区免费视频| 91豆麻精品91久久久久久| 在线观看一区二区视频| 欧美色网一区二区| 日韩一级片网址| 欧美成人免费网站| 国产亚洲一区字幕| 中文字幕一区二区三区精华液| 亚洲视频一区二区在线观看| 亚洲九九爱视频| 天天做天天摸天天爽国产一区| 午夜成人免费电影| 韩国av一区二区三区在线观看| 成人中文字幕在线| 色悠悠久久综合| 一区二区高清免费观看影视大全| 亚洲人吸女人奶水| 人妖欧美一区二区| 国产91精品一区二区麻豆网站| 93久久精品日日躁夜夜躁欧美| 欧美综合一区二区| 日韩欧美中文一区二区| 久久精品在线观看| 亚洲综合在线视频| 韩国一区二区在线观看| 972aa.com艺术欧美| 欧美一区午夜精品| 中文av一区二区| 亚洲不卡av一区二区三区| 国产一区二区成人久久免费影院 | 99精品国产一区二区三区不卡| 在线亚洲一区观看| 精品剧情在线观看| 一区二区三区中文字幕电影| 爽好久久久欧美精品| 国产69精品久久久久毛片| 欧美性高清videossexo| 久久精品亚洲国产奇米99| 亚洲一区二区在线免费看| 韩国三级在线一区| 欧美性猛交一区二区三区精品| 久久综合久色欧美综合狠狠| 亚洲精品老司机| 国模套图日韩精品一区二区| 在线欧美小视频| 国产日韩欧美不卡| 日本vs亚洲vs韩国一区三区| 色综合咪咪久久| 久久久国产午夜精品| 免费人成精品欧美精品| 91国偷自产一区二区使用方法| 久久久久国产精品麻豆ai换脸| 亚洲1区2区3区4区| 91丝袜国产在线播放| 久久天天做天天爱综合色| 天天影视涩香欲综合网| 一本色道亚洲精品aⅴ| 国产欧美一二三区| 蜜臀a∨国产成人精品| 欧美性一二三区| 亚洲天堂av老司机| 丁香另类激情小说| 久久色在线观看| 美女性感视频久久| 91精品国产手机| 天堂影院一区二区| 欧洲精品视频在线观看| 亚洲欧美怡红院| www.日韩大片| 中文字幕久久午夜不卡| 国产91丝袜在线18| 国产欧美中文在线| 国产成人自拍在线| 久久精品视频网| 国产高清视频一区| 韩国女主播成人在线| 在线成人免费观看| 一级特黄大欧美久久久| 91亚洲永久精品| 中文字幕一区av| 91网页版在线| 自拍偷拍亚洲综合| 91美女片黄在线观看91美女| 国产精品免费免费| av不卡一区二区三区| 亚洲欧洲av色图| 色94色欧美sute亚洲线路一久| 亚洲免费观看高清完整版在线观看 | 国产·精品毛片| 亚洲国产精品传媒在线观看| 国产高清成人在线| 成人欧美一区二区三区| 91影院在线观看| 亚洲福利一二三区| 欧美一区二区三区小说| 精品综合久久久久久8888| 久久久影视传媒| 成人午夜视频网站| 亚洲伦理在线免费看| 欧美亚洲综合一区| 美国三级日本三级久久99| 日韩美女在线视频| 国产福利一区二区三区| 中文字幕在线观看一区| 欧美伊人久久久久久午夜久久久久| 亚洲午夜精品久久久久久久久| 91精品国产一区二区三区香蕉| 麻豆久久久久久| 国产精品乱码妇女bbbb| 91国偷自产一区二区使用方法| 视频一区欧美日韩| 久久精品一区二区三区四区| 99精品在线免费| 日本不卡一区二区| 日本一区二区视频在线观看| 97久久精品人人做人人爽| 日韩精品一级二级|