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

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

?? imagecoding.cpp

?? VC++數字圖象獲取,處理
?? CPP
字號:
#include "stdafx.h"
#include "GlobalApi.h"
#include "Cdib.h"

#include <io.h>
#include <errno.h>

#include <math.h>
#include <direct.h>
//using namespace std;

// FOURBYTES就是用來計算離4最近的整倍數
#define FOURBYTES(bits)    (((bits) + 31) / 32 * 4)

/**************************************************************************
 *  文件名:ImageCoding.cpp
 *
 *  正交變換API函數庫:
 *
 *  WRITE2IMG()				- 256色圖象保存為256色IMG文件
 *  LOADIMG()				- 讀取指定的256色IMG文件 
 *  DIBBITPLANE()			- 圖像位平面分解
 *
 ************************************************************************
*/

// PCX文件頭結構
typedef struct{
		 BYTE bManufacturer;
		 BYTE bVersion;
		 BYTE bEncoding;
		 BYTE bBpp;
		 WORD wLeft;
		 WORD wTop;
		 WORD wRight;
		 WORD wBottom;
		 WORD wXResolution;
		 WORD wYResolution;
		 BYTE bPalette[48];
		 BYTE bReserved;
		 BYTE bPlanes;
		 WORD wLineBytes;
		 WORD wPaletteType;
		 WORD wSrcWidth;
		 WORD wSrcDepth;
		 BYTE bFiller[54];
} PCXHEADER;

typedef struct{
		 BYTE bBpp;
		 WORD wLeft;
		 WORD wTop;
		 WORD wRight;
		 WORD wBottom;
		 WORD wXResolution;
		 WORD wYResolution;
} IMGHEADER;

/*************************************************************************
 *
 * 函數名稱:
 *   WRITE2IMG()
 *
 * 參數:
 *   CDib * pDib        - 指向CDib對象的指針
 *   CFile& file        - 要保存的文件
 *
 * 返回值:
 *   BOOL               - 成功返回True,否則返回False。
 *
 * 說明:
 *   該函數將指定的圖象保存為IMG文件。
 *
 *************************************************************************/
BOOL WINAPI WRITE2IMG(CDib * pDib, CFile& file)
{
	
	// 指向源圖像的指針
	unsigned char*	lpSrc;

	//圖象的寬度和高度
	LONG    lWidth;
	LONG    lHeight;

	// 圖像每行的字節(jié)數
	LONG	lLineBytes;
	
	// 循環(huán)變量
	LONG	i;
	LONG	j;
		
	// 參與預測的象素和當前編碼的象素
	BYTE	bCharA;
	BYTE	bCharB;
	BYTE	bCharC;
	BYTE	bCharD;
    
	// 預測值
	int		nTemp;
	
	// 預測后的殘差
	int		nDpcm;
			
	// 指向編碼后圖像數據的指針
	BYTE *	lpDst;		
		
	//得到圖象的寬度和高度
	CSize   SizeDim;
	SizeDim = pDib->GetDimensions();
	lWidth  = SizeDim.cx;
	lHeight = SizeDim.cy;	
	
	//得到實際的Dib圖象存儲大小
	CSize   SizeRealDim;
	SizeRealDim = pDib->GetDibSaveDim();

	// 計算圖像每行的字節(jié)數
	lLineBytes = SizeRealDim.cx;
	
	//圖像數據的指針
	LPBYTE  lpDIBBits = pDib->m_lpImage;
			
	/**********************************************************************
	*寫入IMG文件頭信息
	***********************************************************************
	*/
	IMGHEADER Header4IMG;
	
	// 給文件頭賦值
		
	// 像素位數(256色為8位)
	Header4IMG.bBpp = 8;
	
	// 圖像相對于屏幕的左上角X坐標(以像素為單位)
	Header4IMG.wLeft = 0;
	
	// 圖像相對于屏幕的左上角Y坐標(以像素為單位)
	Header4IMG.wTop = 0;
	
	// 圖像相對于屏幕的右下角X坐標(以像素為單位)
	Header4IMG.wRight = lWidth - 1;
	
	// 圖像相對于屏幕的右下角Y坐標(以像素為單位)
	Header4IMG.wBottom = lHeight - 1;
	
	// 圖像的水平分辨率
	Header4IMG.wXResolution = lWidth;
	
	// 圖像的垂直分辨率
	Header4IMG.wYResolution = lHeight;

	// 寫入文件頭
	file.Write((LPSTR)&Header4IMG, sizeof(IMGHEADER));	
	
	// 編碼第0行
	i = 0;
	for ( j = 0; j < lWidth; j++)
	{
		// 指向圖象0行j列象素的指針
		lpSrc = (BYTE *)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j ;
		
		// 給bCharD賦值
		bCharD = *lpSrc;

		// 如果是第0行0列,直接將象素值寫入
		if(j == 0)
			nDpcm = (int)bCharD;
		// 利用 Dpcm =D - A 計算殘差 
		else
		{
			bCharA = *(lpSrc - 1);
			nDpcm  = (int)bCharD - (int)bCharA;
		}

		// 將殘差寫入文件
		file.Write(&nDpcm , sizeof(int));
	}
	
	// 編碼第1行到lHeight-1行
	for ( i=1;i<lHeight; i++)
	{
		for ( j = 0; j < lWidth; j++)
		{
			// 指向當前編碼元素的指針
			lpSrc = (BYTE *)lpDIBBits + j + lLineBytes * (lHeight - 1 - i);
		
			// 賦值
			bCharD = *lpSrc;
			bCharB = *(lpSrc + lLineBytes);

			// 如果是第一列,利用 殘差=D -B 進行預測
			if(j == 0)
				nDpcm = (int)bCharD - (int)bCharB;
			else
			{
				// 利用(B-C)/2+A計算預測值
				bCharA = *(lpSrc - 1);
				bCharC = *(lpSrc + lLineBytes - 1);
				nTemp  =  (int)((bCharB-bCharC) / 2 + bCharA);
				
				// 如果預測值小于0,直接賦零
				if(nTemp < 0)
					nTemp = 0;
				// 如果預測值大于255,直接賦值255
				else if(nTemp > 255)
					nTemp = 255;
				else
					nTemp = nTemp;

				// 得到殘差
				nDpcm = (int)bCharD - nTemp;
			}

			// 將殘差寫入文件
			file.Write(&nDpcm , sizeof(int));
		}
	}
	
	// 開辟一片緩沖區(qū)以保存調色板
	lpDst = new BYTE[769];
	
	// 調色板起始字節(jié)
	* lpDst = 0x0C;	

	// 得到圖象的調色板
	LPRGBQUAD lpbmc = (LPRGBQUAD)pDib->m_lpvColorTable;
	
	// 讀取當前圖象的調色板
	for (i = 0; i < 256; i ++)
	{
		
			// 讀取DIB調色板紅色分量
			lpDst[i * 3 + 1] = lpbmc[i].rgbRed;
			
			// 讀取DIB調色板綠色分量
			lpDst[i * 3 + 2] = lpbmc[i].rgbGreen;
			
			// 讀取DIB調色板藍色分量
			lpDst[i * 3 + 3] = lpbmc[i].rgbBlue;
	}
	
	// 寫入調色板信息
	file.Write((LPSTR)lpDst, 769);

	// 返回值
	return TRUE;
}

/*************************************************************************
 *
 * 函數名稱:
 *   LOADIMG()
 *
 * 參數:
 *   CDib * pDib        - 指向CDib類的指針
 *   CFile& file        - 要讀取的文件
 *
 * 返回值:
 *   BOOL               - 成功返回TRUE
 *
 * 說明:
 *   該函數將讀取指定的IMG文件
 *
 *************************************************************************/
BOOL WINAPI LOADIMG(CDib * pDib, CFile& file)
{
	// 循環(huán)變量
	LONG	i;
	LONG	j;
		
	// 圖象高度
	LONG	lHeight;
	
	// 圖象寬度
	LONG	lWidth;
	
	// 圖像每行的字節(jié)數
	LONG	lLineBytes;
	
	// 中間變量
	BYTE	bChar;
	int     nTemp;
	
	// 指向源圖像象素的指針
	int *	lpSrc;
	
	// 指向編碼后圖像數據的指針
	BYTE *	lpDst;
	
	// 臨時指針
	int *	lpTemp;

	// 用來參與預測的三個象素和當前編碼象素
	BYTE	bCharA;
	BYTE	bCharB;
	BYTE	bCharC;

	// IMG頭文件
	IMGHEADER Header4IMG;
	
	/**********************************************************************
	*讀出IMG文件頭信息
	***********************************************************************
	*/
	
	// 嘗試讀取文件頭
	if (file.Read((LPSTR)&Header4IMG, sizeof(IMGHEADER)) 
		!= sizeof(IMGHEADER))
	{
		// 大小不對,返回NULL。
		return NULL;
	}
	
	// 獲取圖像高度
	lHeight = Header4IMG.wBottom - Header4IMG.wTop + 1;
	
	// 獲取圖像寬度
	lWidth  = Header4IMG.wRight - Header4IMG.wLeft + 1;
	
	// 計算圖像每行的字節(jié)數
	lLineBytes = FOURBYTES(lWidth * 8);
		
	// 獲得顯示圖象的頭文件
	LPBITMAPINFOHEADER lpBI=pDib->m_lpBMIH;	
		
	// 給圖象頭文件成員賦值
	lpBI->biSize = 40;
	lpBI->biWidth = lWidth;
	lpBI->biHeight = lHeight;
	lpBI->biPlanes = 1;
	lpBI->biBitCount = 8;
	lpBI->biCompression = BI_RGB;
	lpBI->biSizeImage = lHeight * lLineBytes;
	lpBI->biXPelsPerMeter = Header4IMG.wXResolution;
	lpBI->biYPelsPerMeter = Header4IMG.wYResolution;
	lpBI->biClrUsed = 0;
	lpBI->biClrImportant = 0;
	
	// 分配內存以讀取編碼后的象素
	lpSrc = new int[(file.GetLength() - sizeof(IMGHEADER)-769) ];
	
	lpTemp = lpSrc;
	
	// 讀取編碼后的象素
	if (file.ReadHuge(lpSrc, file.GetLength() - sizeof(IMGHEADER)-769) 
		!= file.GetLength() - sizeof(IMGHEADER)-769 )
	{
		
		return FALSE;
	}
	
	// 重新分配內存,以適應新的圖象大小
	delete 	pDib->m_lpImage;
	pDib->m_lpImage = new unsigned char[lHeight * lLineBytes];

	// CDib類中像素位置
	lpDst = pDib->m_lpImage;
	
	// 解碼第0行
	i = 0;
	for(j = 0; j < lWidth; j++)
	{
		if(j==0)
		{
			// 如果是0行0列,編碼值就是真實值
			lpDst[j + lLineBytes * (lHeight - 1 - i)] = (BYTE)(*lpTemp);
			lpTemp ++;
		}
		else
		{
			// 利用 D=A+殘差 得到原來的象素
			lpDst[j+ lLineBytes * (lHeight - 1 - i)]
				= (BYTE)(*lpTemp) + lpDst[j + lLineBytes * (lHeight - 1 - i) - 1];
			lpTemp++;
		}
	}

	// 解碼第1行到第lHeight-1行
	for (i = 1; i < lHeight; i++)
    {
		for (j = 0; j < lWidth; j++)
		{
			// 得到象素B的值
			bCharB = lpDst[j + lLineBytes * (lHeight  - i)];
			
			// 解碼第一列
			if(j==0)
			{
				// 利用 D=B+殘差 得到原來的象素值
				lpDst[j+ lLineBytes * (lHeight - 1 - i)] = (BYTE)((*lpTemp) + bCharB);
				lpTemp++;
			}
			
			// 解碼剩下的列
			else
			{
				// 利用 D=(B-C)/2 + A + 殘差 得到原來的象素值
				bCharA=lpDst[j - 1 + lLineBytes * (lHeight - 1 - i)];
				bCharC=lpDst[j - 1 + lLineBytes * (lHeight - i)];
				
				// 解碼時的預測
				nTemp=(int)((bCharB - bCharC) / 2  +bCharA);
				
				// 預測值小于0,直接賦0
				if(nTemp<0)
					nTemp = 0;
				// 預測值大于255,直接賦值255
				else if(nTemp>255)
					nTemp = 255;				 
				else
					nTemp = nTemp;

				// 預測值+殘差
				lpDst[j + lLineBytes * (lHeight - 1 - i)] 
					= (BYTE)(*lpTemp + (BYTE)nTemp);
				lpTemp++;
			}
		}
	}

	// 釋放內存
	delete lpSrc;
	lpDst  = NULL;
	
	// 讀調色板標志位
	file.Read(&bChar, 1);
	if (bChar != 0x0C)
	{		
		// 返回NULL。
		return FALSE;
	}
	
	// 分配內存以讀取編碼后的象素
	lpDst = new BYTE[768];
	
	// 圖象中調色板的位置
	LPRGBQUAD lpbmc = (LPRGBQUAD)pDib->m_lpvColorTable;
	
	// 讀取調色板
	if (file.Read(lpDst, 768) != 768)
	{		
		return FALSE;
	}
	
	// 給調色板賦值
	for (i = 0; i < 256; i++)
	{	
		lpbmc[i].rgbRed   = lpDst[i * 3 + 2];
		lpbmc[i].rgbGreen = lpDst[i * 3 + 1];
		lpbmc[i].rgbBlue  = lpDst[i * 3];
		lpbmc[i].rgbReserved = 0;
	}
	
	// 返回值
	return TRUE;
}


/*************************************************************************
 *
 * 函數名稱:
 *   DIBBITPLANE()
 *
 * 參數:
 *   CDib * pDib        - 指向CDib類的指針
 *   CFile& file        - 要讀取的文件
 *
 * 返回值:
 *   BOOL               - 成功返回TRUE
 *
 * 說明:
 *   該函數將制定的圖象進行位平面分解
 *
 *************************************************************************/
BOOL WINAPI DIBBITPLANE(CDib *pDib,BYTE bBitNum)
{
	// 如果輸入的數不符合要求,不進行分解
	if(bBitNum <1 || bBitNum >8)
		return FALSE;
	
	// 指向源圖像的指針
	BYTE *	lpSrc;

	//圖象的寬度和高度
	LONG    lWidth;
	LONG    lHeight;

	// 圖像每行的字節(jié)數
	LONG	lLineBytes;
	
	// 循環(huán)變量
	LONG	i;
	LONG	j;

	// 中間變量
	BYTE bTemp;
	BYTE bA;

	// 二進制第i位對應的十進制值
	BYTE bCount;
				
	//得到圖象的寬度和高度
	CSize   SizeDim;
	SizeDim = pDib->GetDimensions();
	lWidth  = SizeDim.cx;
	lHeight = SizeDim.cy;	
	
	//得到實際的Dib圖象存儲大小
	CSize   SizeRealDim;
	SizeRealDim = pDib->GetDibSaveDim();

	// 計算圖像每行的字節(jié)數
	lLineBytes = SizeRealDim.cx;
	
	//圖像數據的指針
	LPBYTE  lpDIBBits = pDib->m_lpImage;	
	
	bCount = 1<<(bBitNum - 1);
	
	for (i = 0; i<lHeight; i++)
	{
		for ( j = 0; j < lWidth; j++)
		{
			// 指向位圖i行j列的指針
			lpSrc = (BYTE *)lpDIBBits + j+lLineBytes * (lHeight - 1 - i);

			// 對位圖按灰度碼進行分解
			if(bBitNum == 8)
			{
				// 如果求的是位圖8,直接取二值的第8位
				bTemp = (*(lpSrc) & bCount) / bCount;
				bTemp = bTemp * 255;
			}
			else
			{
				// 否則進行異或,求得灰度碼
				bTemp = (*(lpSrc) & bCount) / bCount;
				bA    = bCount * 2;

				// 第i+1位圖的象素值
				bA = (*(lpSrc) & bA) / bA;

				// 異或
				bTemp = (bTemp ^ bA) * 255;
			}

			// 更新源圖象
			*(lpSrc) = bTemp;	
		}
	}

	// 返回值
	return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品影视av免费| 国产 欧美在线| 欧美三级资源在线| 九九视频精品免费| 夜夜精品视频一区二区 | 国产精品盗摄一区二区三区| 在线成人av影院| 久草精品在线观看| 蜜桃av一区二区在线观看| 国产精品久久久久久久岛一牛影视 | 一本大道久久a久久精二百| 亚洲人午夜精品天堂一二香蕉| 精品国产髙清在线看国产毛片| 欧美日韩视频第一区| 日本韩国欧美一区| 依依成人精品视频| 欧美视频三区在线播放| 免费在线看一区| 奇米精品一区二区三区在线观看一| 亚洲一区在线观看免费| 亚洲欧美激情插| 国产精品夫妻自拍| 亚洲精品欧美二区三区中文字幕| 中文字幕五月欧美| 亚洲欧美电影一区二区| 国产精品萝li| 亚洲人一二三区| 日本一区二区三级电影在线观看 | 日韩视频123| 91精品国产入口| 欧美一级日韩不卡播放免费| 欧美视频在线一区二区三区| 在线播放亚洲一区| 久久这里只有精品6| 亚洲国产成人一区二区三区| 中文一区二区完整视频在线观看| 国产精品蜜臀在线观看| 亚洲丝袜美腿综合| 亚洲一区在线免费观看| 日韩av一区二区三区四区| 亚洲精品视频在线观看网站| 丝袜美腿一区二区三区| 精品一区二区三区久久久| 国产成人午夜精品影院观看视频 | 欧美午夜在线一二页| 欧美日韩国产一二三| 一区二区三区四区乱视频| 国产精品丝袜黑色高跟| 国产精品污污网站在线观看| 国产精品无遮挡| 欧美日韩精品一区二区| 欧美精品aⅴ在线视频| 久久99精品久久久久久国产越南| 亚洲精品菠萝久久久久久久| 亚洲欧美另类综合偷拍| 亚洲bt欧美bt精品777| 亚洲靠逼com| 午夜影院久久久| 激情综合色综合久久综合| 国产精品一区三区| 91国产免费看| 欧美片在线播放| 一区二区三区在线视频观看58| 国产黑丝在线一区二区三区| 欧美日韩国产综合一区二区三区| 欧美一区二区三区视频在线| 欧美片网站yy| 国产精品网站导航| 精品一区二区三区在线观看| 欧美一区二区精品| av在线综合网| 久久99日本精品| 国产精品二三区| 久99久精品视频免费观看| 欧美在线制服丝袜| 国产精品麻豆欧美日韩ww| 精品一区二区三区免费毛片爱| 日本道在线观看一区二区| 国产人成亚洲第一网站在线播放| 日本免费在线视频不卡一不卡二| jlzzjlzz亚洲日本少妇| 精品日韩在线观看| 美女一区二区久久| 欧美人妇做爰xxxⅹ性高电影| 性做久久久久久免费观看欧美| 国产成人8x视频一区二区| 久久精品国产亚洲高清剧情介绍| 欧美视频中文一区二区三区在线观看 | 九九国产精品视频| 成人激情免费视频| 欧美一区二区三区免费| 亚洲h精品动漫在线观看| 亚洲一区免费在线观看| 五月天久久比比资源色| 日本不卡不码高清免费观看| 美腿丝袜在线亚洲一区 | 国产精品一区二区x88av| 在线亚洲人成电影网站色www| 国产日韩欧美不卡在线| 亚洲精品乱码久久久久久| 欧美精品第1页| 韩国精品在线观看| 喷水一区二区三区| 粉嫩久久99精品久久久久久夜| av不卡免费电影| 91.麻豆视频| 国产精品久久久久久久午夜片 | 国产精品久久久久aaaa樱花| 亚洲自拍偷拍麻豆| 国产在线精品国自产拍免费| 91网站最新地址| 国产女主播一区| 视频一区二区欧美| 色伊人久久综合中文字幕| 欧美tickling网站挠脚心| 一区二区三区日韩欧美精品| 久久99国产精品免费| 成年人网站91| 天天色图综合网| 99在线精品一区二区三区| www成人在线观看| 看片的网站亚洲| 欧美一区二区三区在线观看| 亚洲va欧美va天堂v国产综合| 99精品视频在线播放观看| 不卡av在线网| 日韩一区二区三区视频在线 | 欧美精品一区在线观看| 欧美在线|欧美| 5566中文字幕一区二区电影| 亚洲精品在线一区二区| 在线免费亚洲电影| 成人app在线观看| 久久99国产精品尤物| 日韩福利视频网| 亚洲欧美激情小说另类| 中文字幕av在线一区二区三区| 欧美一区二区不卡视频| 欧美在线短视频| 99re亚洲国产精品| 成人午夜免费视频| 久久99精品久久久久久国产越南 | 欧美理论片在线| 欧美亚洲日本一区| 在线观看亚洲精品视频| 成人av一区二区三区| 国产精品亚洲专一区二区三区| 热久久一区二区| 午夜精品福利在线| 视频在线观看一区二区三区| 亚洲一级不卡视频| 亚洲乱码国产乱码精品精可以看| 国产精品久久久久久久久免费相片 | 艳妇臀荡乳欲伦亚洲一区| 中文字幕一区二区三区色视频| 亚洲高清三级视频| 一区二区三区在线视频观看58| 亚洲欧洲精品一区二区三区不卡| 久久久精品免费免费| 久久久不卡网国产精品一区| 久久在线观看免费| 久久久久免费观看| 国产精品沙发午睡系列990531| 国产网红主播福利一区二区| 久久久久久久久蜜桃| 中文字幕乱码日本亚洲一区二区| 中文一区二区完整视频在线观看| 中文字幕在线观看一区| 亚洲精品国产成人久久av盗摄| 亚洲一区欧美一区| 另类人妖一区二区av| 国产成人综合亚洲91猫咪| www.欧美日韩国产在线| 91黄色免费版| 日韩三级高清在线| 国产日韩av一区二区| 亚洲午夜一区二区| 蜜桃av一区二区| 91视频在线观看免费| 欧美精品一二三| 久久精品人人做| 亚洲一区二区三区视频在线| 免费观看30秒视频久久| 国产成人一级电影| 欧美日韩一区二区在线观看 | 欧美日韩一区二区三区高清| 日韩美女视频在线| 中文字幕日韩精品一区| 日本午夜一本久久久综合| 高清成人免费视频| 欧美久久久久中文字幕| 欧美高清在线一区| 日韩国产欧美视频| 97久久精品人人做人人爽50路| 欧美一区二区视频在线观看| 亚洲人亚洲人成电影网站色| 麻豆精品久久久| 欧美中文字幕不卡| 欧美激情在线观看视频免费| 日韩电影在线一区|