Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2717581
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4193
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: C/C++

2009-03-19 16:23:47

 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)是左下角,数据保存是倒存放的
阅读(2933) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-03-20 11:57:15

groupbox control to display text and icon:: http://www.codeproject.com/KB/miscctrl/XGroupBox.aspx

chinaunix网友2009-03-19 18:00:00

C++实现的一个哈希表类 :: http://www.gisfoot.com/post/172.html