VC里面不用组件加载gif文件大件事了
先在CDC里面加载图片(要转换成DIB)
然后pDC->GetPixel(int x,int y);
或者转换成DIB以后,直接操作DIB获得,麻烦
cxImage类,但你要会使用这个类就可以啦。
1、装入图象:
2、取点的颜色值:
CxImage* pxImage = new CxImage("c:\\a.gif", CXIMAGE_FORMAT_GIF);
if (pxImage->IsValid())
{
if (pxImage->IsInside(x, y))
{
RGBQUAD rgbQurd = pxImage->GetPixelColor(x, y); //得到了颜色值
}
}
delete pxImage;
我对24位BMP文件存储格式的一点心得:
1.以行来计,是从最后一行开始倒序存储的
2.每一行的像素是从左向右顺序存储的
3.每一个像素点3个字节,是按Blue、Green、Red顺序存储的
依此理解,“文件最后一个字节存储是图片右上角像素的红色值”——如果明白了这句话就可说明你理解了上面三点。
4.文件开始14字节是BITMAPFILEHEADER型的结构体,定义如下:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
5.文件开始40字节是BITMAPINFOHEADER型的结构体,定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
6.从第55字节开始存储色彩信息,直到文件尾。
按前三条的说法,第55字节存储的便是图片左下角像素的蓝色值。
/***************CxImage 透明色问题*******************************
有一张png图片,位深为8即(int bpp=cximage->SetTransIndex();bpp==8)
现在我想实现透明贴图的功能:
imgSource=new CxImage();
imgSource->Load("test.png".c_str(),type);
RGBQUAD rgb=imgSource->GetPixelColor(1,1);//取第一个像素为透明色
int bpp=cximage->GetTransIndex();//图片的位深为8
imgSource->IncreaseBpp(bpp);//如果直接填写imgSource->IncreaseBpp(24);则正确透明贴图了
if(bpp==24)
imgSource->SetTransIndex(0);
else
imgSource->SetTransIndex(bpp);
imgSource->SetTransColor(rgb);
imgSource->draw(hdc,0,0);
如果bpp为24则正确透明贴图,否则不能透明,现在我的问题是
CxImage的透明功能是不是只对24位深有效,但是cxImage的API中明确写明了(1,4,8,24)的
api文档中是这样写的,但是实际操作的时候貌似只能针对24的才有用
/*********************************************/
GetImageClrInfo(_T("button.png"));
void CTransparentBltTestDlg::GetImageClrInfo(LPCTSTR imgName)
{
m_clrSimples[0] = -1;
m_clrSimples[1] = -1;
CxImage image;
if (!image.Load(imgName))
return;
RGBQUAD rgb = image.GetPixelColor(0, 0);
m_clrSimples[0] = image.RGBQUADtoRGB(rgb);
rgb = image.GetPixelColor(1, 0);
m_clrSimples[1] = image.RGBQUADtoRGB(rgb);
}
class CTransparentBltTestDlg
{
COLORREF GetImageClrMask(){ return m_clrSimples[0]; }
COLORREF GetImageClrBorder(){ return m_clrSimples[1]; }
void GetImageClrInfo(LPCTSTR imgName);
}
注意:测试png,bmp,发现坐标起始位置(0,0)是左下角,数据保存是倒存放的
阅读(2897) | 评论(2) | 转发(0) |