⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image.cpp

📁 使用的gif89a类以及其他相关文件
💻 CPP
字号:
#include "stdafx.h"
//#include "path.h"
#include "image.h"
#include "gif.h"

CImage::CImage()
{
	m_hImage=0;		
	//m_ImageType=IMT_NULL;
	m_nHeight=0;
	m_nWidth=0;
	m_nBitCount=0;
	m_nPageQuantity=0;
	m_nCurPage=0;
}
CImage::~CImage()
{
	Empty();
}
void CImage::Empty()
{
	if (m_hImage) GlobalFree(m_hImage);
	m_hImage=0;
	//m_ImageType=IMT_NULL;
	m_nHeight=0;
	m_nWidth=0;
	m_nBitCount=0;
	m_nPageQuantity=0;
	m_nCurPage=0;
}
BOOL CImage::Load(LPCTSTR fn)
{
	CString ext;HANDLE hImage;

	hImage=LoadGif(fn);
	if (!hImage) return 0;

	Empty();
	m_hImage=hImage;
	pagequantity();
	m_nCurPage=1;
	read_w_h_bc_rate();
	return 1;
}
BOOL CImage::Save(LPCTSTR fn)
{
	return FALSE;
}

int	CImage::Stretch(HDC hDC,
			int XDest,int YDest,int nDestWidth,int nDestHeight,
			int XSrc, int YSrc, int nSrcWidth, int nSrcHeight)
{
	if (m_hImage==0) return 0;
	
	return StretchResDyn(hDC,XDest,YDest,nDestWidth,nDestHeight,
		XSrc,YSrc,nSrcWidth,nSrcHeight);

}

//显示动态光栅图像的当前帧
int CImage::StretchResDyn(HDC hDC,
			int XDest,int YDest,int nDestWidth,int nDestHeight,
			int XSrc, int YSrc, int nSrcWidth, int nSrcHeight)const

{
	BYTE *lpImage,*lpBits,*lpPal;
	LPBITMAPINFO pbmi;int w,h,bc,palsize,ret;
	LPRESDYNDATAHEADER lpHead;
	LPDISPLAYFRAMEINFO lpDisp;
	LPSTOREFRAMEINFO lpStore;
	
	lpImage=(BYTE*)GlobalLock(m_hImage);
	lpHead=(RESDYNDATAHEADER*)lpImage;
	lpDisp=(LPDISPLAYFRAMEINFO)(lpImage+sizeof(RESDYNDATAHEADER)
				+sizeof(DISPLAYFRAMEINFO)*(m_nCurPage-1));
	lpStore=(LPSTOREFRAMEINFO)(lpImage+sizeof(RESDYNDATAHEADER)
				+sizeof(DISPLAYFRAMEINFO)*m_nPageQuantity
				+sizeof(STOREFRAMEINFO)*(lpDisp->StoreFrame-1));
	w=lpStore->Width;
	h=lpStore->Height;
	bc=lpStore->BitCount;
	lpBits=lpImage+lpStore->DataOfset;
	palsize=(bc==24?0:(1<<bc));
	if (lpStore->LocalPalette)		//有局部调色板
	{
		lpPal=lpBits;
		lpBits+=palsize*sizeof(RGBQUAD);
	}
	else		//没有局部调色板,使用全局调色板
	{
		lpPal=lpImage+sizeof(RESDYNDATAHEADER)
				+sizeof(DISPLAYFRAMEINFO)*lpHead->DisplayFrameQuantity
				+sizeof(STOREFRAMEINFO)*lpHead->StroeFrameQuantity;
	}
	
	//显示AND图
	pbmi=(LPBITMAPINFO)new BYTE[sizeof(BITMAPINFOHEADER)
				+sizeof(RGBQUAD)*palsize];
	pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	pbmi->bmiHeader.biWidth=w;
	pbmi->bmiHeader.biHeight=h;
	pbmi->bmiHeader.biPlanes=1;
	pbmi->bmiHeader.biBitCount=bc;
	pbmi->bmiHeader.biCompression=0;
	pbmi->bmiHeader.biSizeImage=(w*bc+31)/32*4*h;
	pbmi->bmiHeader.biXPelsPerMeter=0;
	pbmi->bmiHeader.biYPelsPerMeter=0;
	pbmi->bmiHeader.biClrUsed=0;
	pbmi->bmiHeader.biClrImportant=0;
	memcpy(&pbmi->bmiColors,lpPal,sizeof(RGBQUAD)*palsize);
	ret=StretchDIBits(hDC,XDest,YDest,nDestWidth,nDestHeight,
				XSrc,YSrc,nSrcWidth,nSrcHeight,lpBits,
				pbmi,DIB_RGB_COLORS,SRCCOPY);

	//显示XOR图
	if (lpStore->XorFlag)
	{
		pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
		pbmi->bmiHeader.biWidth=w;
		pbmi->bmiHeader.biHeight=h;
		pbmi->bmiHeader.biPlanes=1;
		pbmi->bmiHeader.biBitCount=1;
		pbmi->bmiHeader.biCompression=0;
		pbmi->bmiHeader.biSizeImage=w*h;
		pbmi->bmiHeader.biXPelsPerMeter=0;
		pbmi->bmiHeader.biYPelsPerMeter=0;
		pbmi->bmiHeader.biClrUsed=0;
		pbmi->bmiHeader.biClrImportant=0;
		//前景							  //背景
		pbmi->bmiColors[0].rgbRed=0;	  pbmi->bmiColors[1].rgbRed=192;
		pbmi->bmiColors[0].rgbGreen=0;	  pbmi->bmiColors[1].rgbGreen=192;
		pbmi->bmiColors[0].rgbBlue=0;	  pbmi->bmiColors[1].rgbBlue=192;
		pbmi->bmiColors[0].rgbReserved=0; pbmi->bmiColors[1].rgbReserved=0;
		lpBits+=(w*bc+31)/32*4*h;
		ret=StretchDIBits(hDC,XDest,YDest,nDestWidth,nDestHeight,
					XSrc,YSrc,nSrcWidth,nSrcHeight,lpBits,
					pbmi,DIB_RGB_COLORS,SRCINVERT);
	}

	delete[] pbmi;
	GlobalUnlock(m_hImage);
	return ret;
	return 0;
}
BOOL CImage::UpdateDynImage()
{
	static int old_tick=0;
	int tick;
	tick=GetTickCount();
	
	if (tick-old_tick<m_nRate) return 0;
	if (m_nPageQuantity<2) return 0;

	old_tick=tick;
	m_nCurPage++;
	if (m_nCurPage>m_nPageQuantity) m_nCurPage=1;
	read_w_h_bc_rate();
	return 1;
}
//根据图像当前页号取出width,height,bitcount
void CImage::read_w_h_bc_rate()	
{
	if (m_hImage==0)
	{
		m_nWidth=m_nHeight=m_nBitCount=0;
		m_nRate=0;
		return;
	}
	
	
	if (m_nCurPage<1||m_nCurPage>m_nPageQuantity)
	{m_nWidth=m_nHeight=m_nBitCount=m_nRate=0;return;}
	BYTE *lpResDyn;int i;
	LPDISPLAYFRAMEINFO lpDispInfo;
	LPSTOREFRAMEINFO lpStoreInfo;
	
	lpResDyn=(BYTE*)GlobalLock(m_hImage);
	//读取当前帧的延迟时间
	lpDispInfo=(LPDISPLAYFRAMEINFO)(lpResDyn+sizeof(RESDYNDATAHEADER));
	m_nRate=lpDispInfo[m_nCurPage-1].DelayTime;	//转换成毫秒
	//read width, height, bitcount
	lpStoreInfo=(LPSTOREFRAMEINFO)(lpResDyn
		+sizeof(RESDYNDATAHEADER)
		+sizeof(DISPLAYFRAMEINFO)*m_nPageQuantity);
	i=lpDispInfo[m_nCurPage-1].StoreFrame-1;
	m_nWidth=lpStoreInfo[i].Width;
	m_nHeight=lpStoreInfo[i].Height;
	m_nBitCount=lpStoreInfo[i].BitCount;
	
	GlobalUnlock(m_hImage);
	
}
//读取图像文件的页数
void CImage::pagequantity()	
{
	if (m_hImage==0) {m_nPageQuantity=0;return;}
	
	
	LPRESDYNDATAHEADER lpResDyn;
	lpResDyn=(LPRESDYNDATAHEADER)GlobalLock(m_hImage);
	m_nPageQuantity=lpResDyn->DisplayFrameQuantity;
	GlobalUnlock(m_hImage);
	return;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -