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

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

?? pcx.cpp

?? 《精通 vc++ 圖像編程》的源代碼
?? CPP
字號:
// Pcx.cpp: implementation of the CPcx class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>

#include "Pcx.h"

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

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

CPcx::CPcx()
{
	m_pDib = NULL;
}

CPcx::CPcx(CDib *pDib)
{
	m_pDib = NULL;
	SetDib(pDib);
}

CPcx::~CPcx()
{
	if (m_pDib != NULL)
		delete m_pDib;
}

BOOL CPcx::Load(LPCTSTR lpstrFileName)
{
    PCXPALETTE palette[256];
	PCXHEADER header;
	int width, height, bytes, widthbytes;
	BYTE *lpBuffer;
	FILE *inFile;

	/*** Open the PCX file ***/
	if ((inFile=fopen(lpstrFileName,"rb")) == NULL)
		return FALSE;

	/*** Read in the header ***/
	if (!fread((char *)&header, sizeof(PCXHEADER), 1, inFile))
	{
		fclose(inFile);
		return FALSE;
	}

	/*** Check to make sure it's a PCX ***/
	if (header.manufacturer!=0x0A || header.version!=5)
	{
		fclose(inFile);
		return FALSE;
	}

	/*** Find the palette ***/
	if (fseek(inFile, -1*(long)(sizeof(palette)+1), SEEK_END))
	{
		fclose(inFile);
		return FALSE;
	}

	/*** Read in the palette data ***/
	if (fgetc(inFile)!=0x0C || fread((char *)palette, 1, sizeof(palette), inFile) != sizeof(palette))
	{
		fclose(inFile);
		return FALSE;
	}

	/*** Seek to start of image data ***/
	fseek(inFile, (long)sizeof(PCXHEADER), SEEK_SET);

	/*** PCX dimension ***/
	width = (header.xmax - header.xmin) + 1;
	height = (header.ymax - header.ymin) + 1;
	bytes = header.bytesPerLine;
	widthbytes = WIDTHBYTES(bytes*8);

	/*** Allocate  buffer ***/
	DWORD dwBitsSize = widthbytes * height;
	if ((lpBuffer = (BYTE*)malloc(dwBitsSize)) == NULL)
	{
		fclose(inFile);
		return FALSE;
	}

	/*** Translate the image data ***/
	for (int i=0; i<height; ++i)
	{
		if (! ReadPCXLine(bytes, lpBuffer+i*widthbytes, inFile))
		{
			free(lpBuffer);
			fclose(inFile);
			return FALSE;
		}
	}
	VertFlipBuf(lpBuffer, widthbytes, height);

	// file bitmap header
	BITMAPINFOHEADER bmiHeader;
	bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmiHeader.biWidth = width;
	bmiHeader.biHeight = height;
	bmiHeader.biPlanes = 1;
	bmiHeader.biBitCount = 8;
	bmiHeader.biCompression = BI_RGB;
	bmiHeader.biSizeImage = 0;
	bmiHeader.biXPelsPerMeter = 0;
	bmiHeader.biYPelsPerMeter = 0;
	bmiHeader.biClrUsed = 0;
	bmiHeader.biClrImportant = 0;
	// color table
	RGBQUAD ColorTable[256];
	for (i = 0; i < 256; ++i)
	{
		ColorTable[i].rgbRed = palette[i].rgbRed;
		ColorTable[i].rgbGreen = palette[i].rgbGreen;
		ColorTable[i].rgbBlue = palette[i].rgbBlue;
		ColorTable[i].rgbReserved = 0;
	}
    // Allocate enough memory for the new CF_DIB, and copy bits 
	DWORD dwHeaderSize = sizeof(BITMAPINFOHEADER);
    HDIB hDIB = GlobalAlloc(GHND, dwHeaderSize + dwBitsSize + 256*sizeof(RGBQUAD)); 
	if (hDIB == NULL)
	{
		free(lpBuffer);
		fclose(inFile);
		return FALSE;
	}
    LPBYTE lpDIB = (LPBYTE)GlobalLock(hDIB); 
    memcpy(lpDIB, (LPBYTE)&bmiHeader, dwHeaderSize); 
    memcpy(lpDIB+dwHeaderSize, (LPBYTE)&ColorTable, 256*sizeof(RGBQUAD)); 
    memcpy(FindDIBBits((LPBYTE)lpDIB), lpBuffer, dwBitsSize); 

	/*** Clean up ***/
	free(lpBuffer);
	fclose(inFile);

	// create DIB
	if (m_pDib != NULL)
		delete m_pDib;

	m_pDib = new CDib();
	m_pDib->Attach(hDIB);

	return TRUE;
}

BOOL CPcx::Save(LPCTSTR lpstrFileName, CDib* pDib)
{
	if (pDib == NULL)
		pDib = m_pDib;
	if (pDib == NULL)
		return FALSE;

	HDIB hDib = CopyHandle(pDib->GetHandle());
	if (hDib == NULL)
		return FALSE;

	CDib* pDibTmp = new CDib;
	pDibTmp->Attach(hDib);

	UINT uWidth  = pDibTmp->GetWidth();
	UINT uHeight = pDibTmp->GetHeight();

	// convert to 8-bit image
	if (pDibTmp->GetBitCount() != 8)
		pDibTmp->ConvertFormat(8);

	// make PCX header
	PCXHEADER header;
	memset((LPBYTE)&header, 0, sizeof(PCXHEADER));
	header.manufacturer = 0x0A;
	header.version = 5;
	header.encoding = 1;
	header.bitsPerPixel = 8;
	header.xmin = 0;
	header.ymin = 0;
	header.xmax = uWidth-1;
	header.ymax = uHeight-1;
	//header.hres
	//header.vres;
	header.palette[0] = (BYTE)0x00;  // for correct process for mono 
	header.palette[1] = (BYTE)0x00;
	header.palette[2] = (BYTE)0x00;
	header.palette[3] = (BYTE)0xff;
	header.palette[4] = (BYTE)0xff;
	header.palette[5] = (BYTE)0xff;
	//header.palette[48];
	header.reserved = 0;
	header.colourPlanes = 1;
	header.bytesPerLine = uWidth;
	header.paletteType = 2;
	//filler[58];

	// construct PCX palette from DIB color table
    PCXPALETTE palette[256];
	PALETTEENTRY PaletteColors[256];
	pDibTmp->GetPalette()->GetPaletteEntries(0, 256, PaletteColors);
	for (int i=0;i<256;i++) 
	{
		palette[i].rgbRed   = PaletteColors[i].peRed;
		palette[i].rgbGreen = PaletteColors[i].peGreen;
		palette[i].rgbBlue  = PaletteColors[i].peBlue;
	}

	// get bits ptr
	HDIB hDIB = CopyHandle(pDibTmp->GetHandle());
	delete pDibTmp;
	LPBYTE lpDIB = (LPBYTE)GlobalLock(hDIB);
	BYTE* lpBuffer = (BYTE *)FindDIBBits(lpDIB);
	WORD wWidthBytes = (WORD)BytesPerLine(lpDIB);

	/*** Open the PCX file ***/
	FILE *outFile;
	if ((outFile=fopen(lpstrFileName,"wb")) == NULL)
	{
		GlobalUnlock(hDIB);
		GlobalFree(hDIB);
		return FALSE;
	}

	/*** Write the header ***/
	fwrite((char *)&header, sizeof(PCXHEADER), 1, outFile);

	/*** Write image data ***/
	for (i=(int)uHeight-1; i>=0; --i)
	{
		if (! WritePCXLine(header.bytesPerLine, lpBuffer+i*wWidthBytes, outFile))
		{
			fclose(outFile);
			GlobalUnlock(hDIB);
			GlobalFree(hDIB);
			return FALSE;
		}
	}

	/*** Write the palette data ***/
	fputc(0x0c, outFile);
	fwrite((char *)palette, 1, sizeof(palette), outFile);

	// clear & close
	fclose(outFile);
	GlobalUnlock(hDIB);
	GlobalFree(hDIB);

	return TRUE;
}

/****
***** Read a single line of a PCX file.
****/
BOOL CPcx::ReadPCXLine(int bytes, BYTE *p, FILE *fp)
{
	int n=0;
	register int c, i;

	/*** Null the buffer ***/
	do
	{
		c = fgetc(fp) & 0xFF;                   /* get a key byte */
		/*** If it's a run of bytes field ***/
		if ((c&0xC0) == 0xC0)
		{
			i = c & 0x3F;                         /* AND off high bits */
			c = fgetc(fp);                        /* get the run byte */
			while (i--)                           /* run the byte */
				p[n++] = c;
		}
		/*** Else just store it ***/
		else
			p[n++] = c;
	}	while (n < bytes);

	return (ferror(fp) ? FALSE : TRUE);
}

/****
***** Write a single line of a PCX file.
****/
BOOL CPcx::WritePCXLine(int bytes, BYTE *p, FILE *fp)
{
	unsigned int i=0, j=0, t=0;

	do
	{
		i = 0;
		while ((p[t+i]==p[t+i+1]) && ((t+i)<(WORD)bytes) && (i<63))
			++i;
		if (i > 0) /* there are i equal pixels from current position */
		{
			fputc(i|0xc0, fp);          /* write duplicated number */
			fputc(p[t], fp);           /* write pixel value */
			t += i;						/* bytes have been processed */
			j += 2;						/* bytes have been written to file */
		}
		else	/* no duplicated pixel */
		{
			if (((p[t]) & 0xc0) == 0xc0) /* pixel value > 192 ? */
			{
				fputc(0xc1, fp);        /* write identify sign 0xc1 */
				++j;
			}
			fputc(p[t++], fp);
			++j;
		}
	} while (t < (WORD)bytes);

	return (ferror(fp) ? FALSE : TRUE);
}

//
//	vertically flip a buffer 
//	note, this operates on a buffer of widthBytes bytes, not pixels!!!
//
BOOL CPcx::VertFlipBuf(BYTE  * inbuf, UINT widthBytes, UINT height)
{   
	BYTE  *tb1;
	BYTE  *tb2;

	if (inbuf==NULL)
		return FALSE;

	UINT bufsize;

	bufsize=widthBytes;

	tb1= (BYTE *)new BYTE[bufsize];
	if (tb1==NULL) {
		return FALSE;
	}

	tb2= (BYTE *)new BYTE [bufsize];
	if (tb1==NULL) {
		return FALSE;
	}
	
	UINT row_cnt;     
	ULONG off1=0;
	ULONG off2=0;

	for (row_cnt=0;row_cnt<(height+1)/2;row_cnt++) {
		off1=row_cnt*bufsize;
		off2=((height-1)-row_cnt)*bufsize;   
		
		memcpy(tb1,inbuf+off1,bufsize);
		memcpy(tb2,inbuf+off2,bufsize);	
		memcpy(inbuf+off1,tb2,bufsize);
		memcpy(inbuf+off2,tb1,bufsize);
	}	

	delete [] tb1;
	delete [] tb2;

	return TRUE;
}        

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人免费av在线| 国产精品自在欧美一区| 日韩无一区二区| jlzzjlzz亚洲女人18| 日韩高清一区在线| 日韩美女视频一区二区| 欧美不卡在线视频| 欧美日韩一区二区三区在线| 夫妻av一区二区| 久久91精品国产91久久小草| 亚洲一级在线观看| 国产精品欧美久久久久一区二区| 欧美一二三四在线| 91成人在线观看喷潮| 国产精品18久久久久久vr| 日韩影院免费视频| 亚洲一卡二卡三卡四卡无卡久久| 亚洲国产精品二十页| 欧美精品一区二区在线播放| 欧美日韩国产首页| 91久久久免费一区二区| 成人av在线资源网站| 国产一区二区看久久| 天堂蜜桃一区二区三区| 亚洲精品免费一二三区| 久久国产精品第一页| 一区二区三区小说| 1024亚洲合集| 亚洲欧美偷拍另类a∨色屁股| 国产天堂亚洲国产碰碰| 精品国产乱码久久| 精品美女在线播放| 欧美精品一区二区三区在线播放| 欧美一区二区三区免费观看视频 | 成人免费黄色在线| 经典三级在线一区| 国产综合色在线| 精品亚洲国产成人av制服丝袜 | 一区二区三区精密机械公司| 欧美国产97人人爽人人喊| 久久免费国产精品| 久久精品欧美一区二区三区不卡| 欧美本精品男人aⅴ天堂| 日韩精品一区二区三区在线播放| 欧美一区二区视频在线观看2020| 在线不卡中文字幕播放| 精品视频1区2区| 欧美日韩夫妻久久| 日韩精品专区在线影院重磅| 欧美成人女星排名| 久久免费美女视频| 国产精品乱码久久久久久| 国产精品激情偷乱一区二区∴| 中文字幕国产精品一区二区| 中文字幕在线播放不卡一区| 亚洲人吸女人奶水| 午夜精品久久久久久久久| 91免费在线视频观看| 色丁香久综合在线久综合在线观看| 一本到高清视频免费精品| 色婷婷av一区二区| 欧美日韩国产天堂| 久久综合九色综合欧美就去吻| 国产亚洲欧美日韩在线一区| 欧美精彩视频一区二区三区| 亚洲欧美日韩国产另类专区| 性久久久久久久久| 美女mm1313爽爽久久久蜜臀| 国产黄人亚洲片| 91老司机福利 在线| 欧美日韩精品电影| 欧美精品一区二| 国产精品国产三级国产a | 亚洲第一主播视频| 蜜桃视频在线观看一区| 成人精品小蝌蚪| 欧美性大战xxxxx久久久| 91精品国产品国语在线不卡| 久久久夜色精品亚洲| 樱花影视一区二区| 美女视频网站久久| 99久久综合国产精品| 制服丝袜av成人在线看| 国产三级精品视频| 视频一区国产视频| 成人黄色小视频| 亚洲影视资源网| 国产精品亚洲午夜一区二区三区| 99久久精品免费看国产| 91精品国产综合久久福利软件| 久久精品人人做人人综合| 艳妇臀荡乳欲伦亚洲一区| 精品一区二区三区久久| 在线视频中文字幕一区二区| 国产午夜一区二区三区| 亚洲福利国产精品| 处破女av一区二区| 日韩手机在线导航| 亚洲激情综合网| 国产在线看一区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 精品国产亚洲在线| 亚洲高清视频的网址| av动漫一区二区| 久久久亚洲国产美女国产盗摄 | 老司机免费视频一区二区三区| 99久久国产综合精品色伊| 欧美www视频| 三级一区在线视频先锋 | 成人欧美一区二区三区1314| 久久精品国产网站| 欧美日韩精品久久久| 国产精品的网站| 国产激情91久久精品导航 | 欧美二区三区的天堂| 中文字幕一区二区三区四区不卡| 老司机精品视频一区二区三区| 欧美视频一区二区在线观看| 亚洲人成人一区二区在线观看 | 日韩欧美亚洲国产精品字幕久久久| 一区二区在线观看视频| 成人精品国产一区二区4080| 久久影音资源网| 久久精品国产久精国产爱| 欧美色视频在线观看| 亚洲视频一区二区在线| 99精品在线观看视频| 中文字幕日韩av资源站| 不卡电影免费在线播放一区| 国产无人区一区二区三区| 国产一区在线观看麻豆| 精品国产乱码久久久久久夜甘婷婷| 日本欧美大码aⅴ在线播放| 欧美日本韩国一区| 无码av中文一区二区三区桃花岛| 欧美视频日韩视频| 亚洲va国产天堂va久久en| 欧美久久一二区| 午夜激情久久久| 337p亚洲精品色噜噜噜| 欧美区视频在线观看| 亚洲一区二区三区爽爽爽爽爽 | 久久久久久久久久久久久夜| 另类小说一区二区三区| 精品国产在天天线2019| 国产成人综合精品三级| 中文字幕精品综合| 91网站最新网址| 亚洲国产sm捆绑调教视频| 欧美精品123区| 精品亚洲国产成人av制服丝袜 | 欧美精品在线一区二区| 天堂一区二区在线免费观看| 欧美电视剧免费全集观看| 国产一区二区91| 中文字幕日韩一区二区| 欧美伊人精品成人久久综合97 | 国产精品国产三级国产普通话三级 | 久久99久久99小草精品免视看| 日韩一区二区三区视频在线观看| 蜜桃视频在线一区| 中文字幕成人av| 一本到一区二区三区| 天天影视色香欲综合网老头| 精品国产99国产精品| 不卡视频在线看| 午夜久久久影院| 国产亚洲欧美激情| 色悠久久久久综合欧美99| 日韩av电影天堂| 国产午夜精品一区二区三区视频| 色综合久久久久综合体桃花网| 日日夜夜精品视频天天综合网| 精品福利一区二区三区免费视频| 成人h精品动漫一区二区三区| 亚洲一区二区精品视频| 久久伊人蜜桃av一区二区| 99久久er热在这里只有精品15| 亚洲成人免费观看| 久久久国产午夜精品| 在线免费观看视频一区| 国产一区二区三区| 亚洲精品欧美激情| 久久久av毛片精品| 欧美日韩免费视频| 国产a级毛片一区| 午夜精品久久久久久| 国产精品国产自产拍在线| 日韩一区二区三区四区| 99这里只有久久精品视频| 日本特黄久久久高潮| 亚洲欧洲日韩在线| 久久影视一区二区| 欧美男女性生活在线直播观看| 国产精品一区专区| 天天色天天操综合| 亚洲精品福利视频网站| 久久婷婷久久一区二区三区| 欧美日韩精品一区二区天天拍小说 | 精品国产免费久久|