📄 image.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 + -