http://www.moon4chen.com/

32位BMP带通道的透明图转化24位BMP带通道透明图问题

首先说明谁说BMP不可以透明?别这么和我说我已经用PS的通道实现了但问题来了,我现在只能保存32位的带通道的透明BMP文件,我如何保存24位的BMP仍然可以带通道透明效果以下是在网上已经有人解决的方法,不过我不搞编程。这东西实在是看不懂,如果有明白的可以说下是在什么东西里,编写什么命令语句最好

 

---------------------------------------------------------------------

 

RGB24  

  RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:  

typedef struct tagRGBTRIPLE {

  BYTE rgbtBlue; // 蓝色分量

  BYTE rgbtGreen; // 绿色分量

  BYTE rgbtRed; // 红色分量

  } RGBTRIPLE;

 

 

RGB32

  RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB32。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。通常可以使用RGBQUAD数据结构来操作一个像素,它的定义为:  typedef struct tagRGBQUAD {

  BYTE rgbBlue; // 蓝色分量

  BYTE rgbGreen; // 绿色分量

  BYTE rgbRed; // 红色分量

  BYTE rgbReserved; // 保留字节(用作Alpha通道或忽略)

  } RGBQUAD。

就是多了一个透明通道,直接右移8为丢掉这个8位信息就可以了

----------------------------------------------------------------------------

所以只要移除透明的分量就ok:

 

case 32:
		{
			// 对于32位图像,丢弃透明部分数据
			// 读取数据文件
			int size = (bih.biWidth*4+nAdjust24)*bih.biHeight;
			data= new BYTE[size];
			pData24 = new BYTE[size];
			fseek(f,bfh.bfOffBits,SEEK_SET);	
			fread(data,size,1,f);
			fclose(f);
			for (j=0;j<bih.biHeight;j++){
				for (i = 0;i<bih.biWidth;i++)
				{
					// 只保存 RGB,不处理 alpha
					pData24[j*(bih.biWidth*3+nAdjust24)+i*3] = data[j*(bih.biWidth*4+nAdjust24)+i*4+2];
					pData24[j*(bih.biWidth*3+nAdjust24)+i*3+1] = data[j*(bih.biWidth*4+nAdjust24)+i*4+1];
					pData24[j*(bih.biWidth*3+nAdjust24)+i*3+2] = data[j*(bih.biWidth*4+nAdjust24)+i*4];
				}
			}
			nComponent = 3;
			break;
		}

 

 

 

posted @ 2014-04-10 23:15  谌皓徽  阅读(1330)  评论(0编辑  收藏  举报