24位bmp位图转换为24位ico图标(透明效果)
- 格式:doc
- 大小:33.50 KB
- 文档页数:2
Windows位图和Leptonica位图的转换Windows位图(BMP)和Leptonica位图的转换是图像处理中常见的操作。
Windows位图是一种常见的位图图像格式,通常用于存储图像。
而Leptonica是一个开放源码的图像处理库,拥有丰富的图像处理功能。
在实际应用中,我们常常需要将Windows位图和Leptonica位图进行相互转换,以便利用它们各自的优势和功能。
本文将详细介绍Windows 位图和Leptonica位图的特点,以及它们之间的转换方法。
一、Windows位图(BMP)的特点Windows位图(BMP)是一种常见的位图图像格式,它采用无损压缩的方式存储图像数据。
Windows位图使用的是RGB颜色模式,每个像素由红、绿、蓝三个色彩通道组成,可以表示出丰富的颜色。
Windows位图支持多种色彩深度,包括1位、4位、8位、16位、24位和32位等,能够适应不同的图像需求。
Windows位图还支持无损压缩和有损压缩两种方式,可以根据实际需求选择合适的压缩方式,以便在保证图像质量的同时减小文件大小。
二、Leptonica位图的特点Leptonica是一个开放源码的图像处理库,它提供了丰富的图像处理功能,包括图像的加载、保存、处理、分析等。
Leptonica库支持多种图像格式,包括BMP、PNG、JPEG等,能够满足不同图像处理需求。
Leptonica库使用的是灰度图像格式,每个像素只有一个灰度值,适合于图像处理和分析。
Leptonica库还提供了丰富的图像处理函数,包括图像平滑、边缘检测、形态学处理等,能够满足不同的图像处理需求。
在实际应用中,我们经常需要将Windows位图和Leptonica位图进行相互转换,以便在不同的图像处理场景中使用。
下面将介绍Windows位图和Leptonica位图之间的转换方法。
```#include <leptonica/allheaders.h>Pix *pix = pixRead(inputFile);if (pix == nullptr) {fprintf(stderr, "Error: cannot read input file\n");return 1;}pixDestroy(&pix);return 0;}```在上面的示例代码中,我们使用了Leptonica库中的`pixRead`函数加载Windows位图,并使用`pixWrite`函数将其转换为Leptonica位图格式。
如何用PHOTOSHOP和大魔头一起制作透明背景的ICOPosted by dmt on 2011 年01 月04 日Leave a comment (1) Go to comments1:用PHOTOSHOP新建一个图片,选择透明背景2:制作完毕,在保存的时候选择存储为WEB所用格式ALT+SHIFT+CTRL+S然后按图选择PNG-24,并勾选透明度。
最后把存储好的文件上传到大魔头ICO转换制作,转换成功后下载即可。
实测DELPHI2010 使用透明ICO 成功。
利用IconWorkshop制作背景透明ico图标ico是Icon file的缩写,是Windows的图标文件格式的一种,可以存储单个图案、多尺寸、多色板的图标文件。
图标是具有明确指代含义的计算机图形。
其中桌面图标是软件标识,界面中的图标是功能标识。
图标有一套标准的大小和属性格式,且通常是小尺寸的。
每个图标都含有多张相同显示内容的图片,每一张图片具有不同的尺寸和发色数。
一个图标就是一套相似的图片,每一张图片有不同的格式。
从这一点上说图标是三维的。
图标还有另一个特性:它含有透明区域,在透明区域内可以透出图标下的桌面背景。
在结构上图标其实和麦当劳的巨无霸汉堡差不多。
一个图标实际上是多张不同格式的图片的集合体,并且还包含了一定的透明区域。
因为计算机操作系统和显示设备的多样性,导致了图标的大小需要有多种格式。
操作系统在显示一个图标时,会按照一定的标准选择图标中最适合当前显示环境和状态的图像。
如果你用的是Windows98操作系统,显示环境是800x600分辨率,32位色深,你在桌面上看到的每个图标的图像格式就是256色32x32象素大小。
如果在相同的显示环境下,Windows XP操作系统中,这些图标的图像格式就是:真彩色(32位色深)、32x32象素大小。
下面就是Windows各个操作系统中的标准图标格式:(单位:大小象素—颜色)Windows 98 SE/ME/200048 x 48 - 256 32 x 32 - 256 16 x 16 - 25648 x 48 - 16 32 x 32 - 16 16 x 16 - 16Windows XP48 x 48 - 32bit 32 x 32 - 32bit 24 x 24 - 32bit * 16 x 16 - 32bit(32位真彩色支持多通道透明。
8位、24位、32位图像数据转换最近调⽤⼀个⼈体检测算法,算法要求输⼊的是图⽚的BGR数据,但是拿到的数据是32位Argb数据,算法⽆法正确进⾏⼈体检测,从⽹上百度⽂库中搜到⼀个C#代码,可以进⾏转换。
⽹上的代码有点乱,整理了⼀下,记录留存。
整理后的代码如下:1class BitmapConvertHelp2 {3struct BitmapFileHeader4 {5//位图⽂件头6public UInt16 bfType;7public UInt32 bfSize;8public UInt16 bfReserved1;9public UInt16 bfReserved2;10public UInt32 bfOffBits;11 }1213struct BitmapInfoHeader14 {15//位图信息头16public UInt32 biSize;17public UInt32 biWidth;18public UInt32 biHeight;19public UInt16 biPlanes;20public UInt16 biBitCount;21public UInt32 biCompression;22public UInt32 biSizeImage;23public UInt32 biXPelsPerMeter;24public UInt32 biYPelsPerMeter;25public UInt32 biClrUsed;26public UInt32 biClrImportant;27 }2829struct RGBQUAD30 {31//位图调⾊板项32public byte rgbBlue;33public byte rgbGreen;34public byte rgbRed;35public byte rgbReserved;36 }3738private string filepath = null;//需打开的位图的路径39private string savepath = null;//转换后位图的保存路径40private BitmapFileHeader bfh;41private BitmapInfoHeader bih;4243private void Save8Bits(Bitmap bmp)44 {45//为位图⽂件头赋值46 bfh.bfOffBits = 1078;47 bfh.bfReserved1 = 0;48 bfh.bfReserved2 = 0;49 bfh.bfSize = 14;50 bfh.bfType = 19778;51//为位图信息头赋值52 bih.biBitCount = 8;53 bih.biClrImportant = 0;54 bih.biClrUsed = 0;55 bih.biCompression = 0;56 bih.biHeight = (uint)bmp.Height;57 bih.biPlanes = 1;58 bih.biSize = 40;59 bih.biSizeImage = (uint)(bmp.Height * ((bmp.Width * 8 + 31) / 32 * 4));60 bih.biWidth = (uint)bmp.Width;61 bih.biXPelsPerMeter = 0;62 bih.biYPelsPerMeter = 0;63//构造256⾊的调⾊板,⾮索引图64 RGBQUAD[] pal = new RGBQUAD[256];65for (int i = 0; i < 256; i++)66 {67 pal[i].rgbBlue = (byte)i;68 pal[i].rgbGreen = (byte)i;69 pal[i].rgbRed = (byte)i;70 pal[i].rgbReserved = 0;71 }72 FileInfo f = new FileInfo(savepath);73using (BinaryWriter bw = new BinaryWriter(f.OpenWrite()))74 {75//写⼊⽂件头76 bw.Write(bfh.bfType);77 bw.Write(bfh.bfSize);78 bw.Write(bfh.bfReserved1);79 bw.Write(bfh.bfReserved2);80 bw.Write(bfh.bfOffBits);81//写⼊信息头82 bw.Write(bih.biSize);83 bw.Write(bih.biWidth);84 bw.Write(bih.biHeight);85 bw.Write(bih.biPlanes);86 bw.Write(bih.biBitCount);87 bw.Write(bih.biCompression);88 bw.Write(bih.biSizeImage);89 bw.Write(bih.biXPelsPerMeter);90 bw.Write(bih.biYPelsPerMeter);91 bw.Write(bih.biClrUsed);92 bw.Write(bih.biClrImportant);93//写⼊调⾊板94for (int i = 0; i < 256; i++)95 {96 bw.Write(pal[i].rgbBlue);97 bw.Write(pal[i].rgbGreen);98 bw.Write(pal[i].rgbRed);99 bw.Write(pal[i].rgbReserved);100 }101//位图上下翻转102 bmp.RotateFlip(RotateFlipType.Rotate180FlipX);103 BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); 104unsafe105 {106byte* ptr = (byte*)data.Scan0.ToPointer();107//位图的指针108109byte[] line = new byte[data.Stride];110//保存位图的⼀⾏111for (int i = 0; i < data.Stride; i++)112 line[i] = 0;113for (int i = 0; i < bmp.Height; i++)114 {115for (int j = 0; j < bmp.Width; j++)116 {117 line[j] = *ptr++;118 }119 ptr += data.Stride - bmp.Width;//指针跳过对齐的字节120 bw.Write(line, 0, line.Length);//写⼊位图的⼀⾏121 }122 }123 bw.Close();124 bmp.UnlockBits(data);125 }126 }127128public void Bit8To24()129 {130 Bitmap bmp8 = new Bitmap(filepath);131 BitmapData data8 = bmp8.LockBits(new Rectangle(0, 0, bmp8.Width, bmp8.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); 132 Bitmap bmp24 = new Bitmap(bmp8.Width, bmp8.Height, PixelFormat.Format24bppRgb);133 BitmapData data24 = bmp24.LockBits(new Rectangle(0, 0, bmp24.Width, bmp24.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); 134unsafe135 {136byte* ptr8 = (byte*)data8.Scan0.ToPointer();137byte* ptr24 = (byte*)data24.Scan0.ToPointer();138for (int i = 0; i < bmp8.Height; i++)139 {140for (int j = 0; j < bmp8.Width; j++)141 {142//⽤8位位图的灰度值填充24位位图的R、G、B值143 *ptr24++ = *ptr8;144 *ptr24++ = *ptr8;145 *ptr24++ = *ptr8++;146 }147 ptr8 += data8.Stride - bmp8.Width; //跳过对齐字节148 ptr24 += data24.Stride - bmp8.Width * 3; //跳过对齐字节149 }150 }151 bmp8.UnlockBits(data8);152 bmp24.UnlockBits(data24);153 bmp24.Save(savepath);154 }155156public void Bit8To32()157 {158 Bitmap bmp8 = new Bitmap(filepath);159 BitmapData data8 = bmp8.LockBits(new Rectangle(0, 0, bmp8.Width, bmp8.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); 160 Bitmap bmp32 = new Bitmap(bmp8.Width, bmp8.Height, PixelFormat.Format32bppArgb);161 BitmapData data32 = bmp32.LockBits(new Rectangle(0, 0, bmp32.Width, bmp32.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); 162163unsafe164 {165byte* ptr8 = (byte*)data8.Scan0.ToPointer();166byte* ptr32 = (byte*)data32.Scan0.ToPointer();167for (int i = 0; i < bmp8.Height; i++)168 {169for (int j = 0; j < bmp8.Width; j++)170 {171//⽤8位位图的灰度值,填充32位位图的RGB值,透明度为100%172 *ptr32++ = *ptr8;173 *ptr32++ = *ptr8;174 *ptr32++ = *ptr8++;175 *ptr32++ = 255;176 }177 ptr8 += data8.Stride - bmp8.Width;178 ptr32 += data32.Stride - bmp8.Width * 4;179 }180 }181 bmp8.UnlockBits(data8);182 bmp32.UnlockBits(data32);183 bmp32.Save(savepath);184 }185186public void Bit24To8()187 {188 Bitmap bmp24 = new Bitmap(filepath);189 BitmapData data24 = bmp24.LockBits(new Rectangle(0, 0, bmp24.Width, bmp24.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 190 Bitmap bmp8 = new Bitmap(bmp24.Width, bmp24.Height, PixelFormat.Format8bppIndexed);191 BitmapData data8 = bmp8.LockBits(new Rectangle(0, 0, bmp8.Width, bmp8.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); 192193unsafe194 {195byte* ptr24 = (byte*)data24.Scan0.ToPointer();196byte* ptr8 = (byte*)data8.Scan0.ToPointer();197for (int i = 0; i < bmp8.Height; i++)198 {199for (int j = 0; j < bmp8.Width; j++)200 {201//⽤RGB值的均值作为8位位图的灰度值202 *ptr8++=(byte)(((int)(*ptr24++)+(int)(*ptr24++)+(int)(*ptr24++))/3);203 }204 ptr24 += data24.Stride - bmp8.Width * 3;205 ptr8 += data8.Stride - bmp8.Width;206 }207 }208 bmp8.UnlockBits(data8);209 bmp24.UnlockBits(data24);210 Save8Bits(bmp8);211 }212213public void Bit32To8()214 {215 Bitmap bmp32 = new Bitmap(filepath);216 BitmapData data32 = bmp32.LockBits(new Rectangle(0, 0, bmp32.Width, bmp32.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 217 Bitmap bmp8 = new Bitmap(bmp32.Width, bmp32.Height, PixelFormat.Format8bppIndexed);218 BitmapData data8 = bmp8.LockBits(new Rectangle(0, 0, bmp8.Width, bmp8.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); 219unsafe220 {221byte* ptr32 = (byte*)data32.Scan0.ToPointer();222223byte* ptr8 = (byte*)data8.Scan0.ToPointer();224for (int i = 0; i < bmp8.Height; i++)225 {226for (int j = 0; j < bmp8.Width; j++)227 {228//⽤32位位图的RGB值的均值作为8位位图的灰度值229 *ptr8++ = (byte)(((int)(*ptr32++) + (int)(*ptr32++) + (int)(*ptr32++)) / 3);230 ptr32++;//跳过透明度字节231 }232 ptr32 += data32.Stride - bmp32.Width * 4;233 ptr8 += data8.Stride - bmp8.Width;234 }235 }236 bmp8.UnlockBits(data8);237 bmp32.UnlockBits(data32);238 Save8Bits(bmp8);239 }240241public void Bit32To24()242 {243 Bitmap bmp32 = new Bitmap(filepath);244 BitmapData data32 = bmp32.LockBits(new Rectangle(0, 0, bmp32.Width, bmp32.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 245 Bitmap bmp24 = new Bitmap(bmp32.Width, bmp32.Height, PixelFormat.Format24bppRgb);246 BitmapData data24 = bmp24.LockBits(new Rectangle(0, 0, bmp24.Width, bmp24.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); 247unsafe248 {249byte* ptr32 = (byte*)data32.Scan0.ToPointer();250byte* ptr24 = (byte*)data24.Scan0.ToPointer();251for (int i = 0; i < bmp24.Height; i++)252 {253for (int j = 0; j < bmp24.Width; j++)254 {255//将32位位图的RGB值赋值给24位位图的RGB值256 *ptr24++ = *ptr32++;257 *ptr24++ = *ptr32++;258 *ptr24++ = *ptr32++;259 ptr32++;//跳过透明度字节260 }261 ptr24 += data24.Stride - bmp24.Width * 3;262 ptr32 += data32.Stride - bmp32.Width * 4;263 }264 }265 bmp32.UnlockBits(data32);266 bmp24.UnlockBits(data24);267 bmp24.Save(savepath);268 }269270public void Bit24To32()271 {272 Bitmap bmp24 = new Bitmap(filepath);273 BitmapData data24 = bmp24.LockBits(new Rectangle(0, 0, bmp24.Width, bmp24.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 274 Bitmap bmp32 = new Bitmap(bmp24.Width, bmp24.Height, PixelFormat.Format32bppArgb);275 BitmapData data32 = bmp32.LockBits(new Rectangle(0, 0, bmp32.Width, bmp32.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); 276unsafe277 {278byte* ptr24 = (byte*)data24.Scan0.ToPointer();279byte* ptr32 = (byte*)data32.Scan0.ToPointer();280for (int i = 0; i < bmp32.Height; i++)281 {282for (int j = 0; j < bmp32.Width; j++)283 {284//将24位位图的RGB值赋值给32位位图的RGB分量285 *ptr32++ = *ptr24++;286 *ptr32++ = *ptr24++;287 *ptr32++ = *ptr24++;288 *ptr32++ = 255;//设透明度为100%289 }290 ptr24 += data24.Stride - bmp24.Width * 3;291 ptr32 += data32.Stride - bmp32.Width * 4;292 }293 }294 bmp32.UnlockBits(data32);295 bmp24.UnlockBits(data24);296 bmp32.Save(savepath);297 }298 }。
*.BMP位图透明格式的详解制作教程
2007-02-11 17:44
透明格式的 BMP 位图是存在的...在图片浏览器中是看不到效果的..这一点一定要清楚
WINXP里的预设位图都是256色..也就是8位元.因此不需要带a通道..WINXP本身就认可8位元的背景255.0.255 为透明色
实现这种格式有五种方法
第一种:就是有人提到的使用 Iconworkshop 6.0 转换一下. (注意:最好用做好的PNG图转成带α通道的Windows 位图BMP(32位))采用alpha通道的这种格式能在Windows下面的程序中用...
在DLL中的透明位图资源中,要看清楚你要替换资源的分辩率及位深度(即8位, 16位,32位)
第二种:就是把做好的PNG导入到画图工具里..另存为24位位图..就可以了..效果同上..
第三种:有些资源里面不是有一些位图周围是紫色的吗,把那个位图保下来,然后在这个位图里面编辑你要的图形(这个是索引16位位图),这种位图可以在Windows下使用
下面这张是从DLL的位图资源里保存出来的,进行说明
第四种:制作好你的位图以后,在通道标签里新建一个ALpha通道,把你想透明的部分用黑色填充,其余部分用白色填充。
最后保存成32位位图。
效果第一种一样。
第五种:是自己做Windows默认为RGB色255,0,255(紫色)为透明。
读取并在屏幕上显示24位bmp图像PS:本文非原创,code来自互联网。
代码如下:/*这里仅仅是一个简单的显示也可以写出适用于各种OpenGL使用例如设置我们甚至可以使用负的系数,使得整个图象进行水平方向或垂直方向的翻转(默认像素从左绘制到右,但翻转后将从右绘制到左。
默认像素从下绘制到上,但翻转后将从上绘制到下。
因此,*/ opengl#include <gl/#definestaticstaticstaticstaticstatic#include <stdio.h>#include <stdlib.h>void{////// glClear(GL_COLOR_BUFFER_BIT);//GL_glutSwapBuffers();}int{FILE* pFile = fopen(str,exit(fseek(pFile,fread(&ImageWidth,fread(&ImageHeight,PixelLength = ImageWidth *++PixelLength;PixelLength *= ImageHeight;exit(fseek(pFile,fread(fclose(pFile);glutInit(&argc, argv);glutInitDisplayMode(GLUT_glutInitWindowPosition(glutInitWindowSize(ImageWidth, ImageHeight);glutCreateWindow(FileName);glutDisplayFunc(&display);glutMainLoop();}显示结果截图如下:为方便理解程序,下面把网上找的关于部分bmp图像格式的说明也写在下面了,如果还想了解的更清楚,就自己再google下,很多相关资料的。
BMP文件是一种像素文件,它保存了一幅图象中所有的像素。
利用Photoshop制作高清透明ICO图标
1/11
网上下载或者自己制作一张自己需要的高清图片,要求背景和主体要有明显的区别(便于编辑),下图以一张QQ图为例;
2/11
下载并安装Photoshop软件,用它打开下载的图片,选择工具栏中的“魔棒”工具;
3/11
用魔棒工具多次单击背景(主要上方的设置),将所有背景选中后右键单击,选择下拉菜单中的“选择反向”;
4/11
按快捷键“Ctrl+C”复制图像,或者选择编辑菜单下的“拷贝”;
5/11
按快捷键“Ctrl+N”复制图像,或者选择文件菜单下的“新建”;
6/11
在弹出的窗口中设置背景为“透明”,而后单击“确定”;
7/11
按快捷键“Ctrl+V”粘贴图像,或者选择编辑菜单下的“粘贴”;
8/11
选择文件菜单下的“存储为Web和设备所有格式”;
9/11
在弹出的界面中单击“存储”按钮(右上方可进行一些设置,但必须保证图片格式为GIF);
10/11
下载并安装perfecticon图标制作工具,用它打开刚才保存的GIF透明图片,设置图标样式,设置完成后单击保存即可生成.ico格式的图片;
11/11
下图的左侧是我将制作好的.ico格式的图标加载到自己编写的一个程序上的效果,右侧是QQ软件快捷方式;。
网上已经有了不少地关于如果透明显示位图的文档,但是这些文章中有一个非常大的缺陷,如果当一个位图并不是24位色彩的位图时,换句话说,当一个位图是2位或4位或8位的位图时,由于这些位图使用调色板信息,使用一般的透明显示位图的方法,将会出现色彩错乱的现象,不能正确地显示一个透明的位图。
我在前人文档的基础上,对他们的显示方法做了一些修正,则可以正确地显示任何位数色彩的透明位图。
下面的DrawTransparentBmp函数是一个完整的正确显示透明位图的函数,其各参数说明如下:HDC hdc:目标HDC,即将要绘制位图的HDCHBITMAP hbmp:位图的句柄,此位图可以是2位、4位、8位、16位、24位位图。
RECT &rect:将要绘制的区域COLORREF colorTrans:透明色函数清单如下:BOOL DrawTransparentBmp(HDC hdc, HBITMAP hbmp, RECT &rect, COLORREF colorTrans) {HDC dcImage, dcTrans, dcImage24;HBITMAP holdbmp24, hbmp24;HBITMAP holdbmp;HBITMAP hbmpTrans, holdbmpTrans;// 创建内存DCdcImage = CreateCompatibleDC(hdc);dcTrans = CreateCompatibleDC(hdc);dcImage24 = CreateCompatibleDC(hdc);if (dcImage == NULL || dcTrans == NULL || dcImage24 == NULL)// Error: can't create compatible dcreturn FALSE;// 获得图像属性BITMAP bmp;GetObject(hbmp, sizeof(bmp), &bmp);// 选择图片到dcImage中holdbmp = (HBITMAP)SelectObject(dcImage, hbmp);// 创建24色位图,这样才能正确地显示带透明色的位图LPBITMAPINFO lpBmpInfo;lpBmpInfo = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER)];lpBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);lpBmpInfo->bmiHeader.biPlanes = 1;lpBmpInfo->bmiHeader.biBitCount = nBitCount;lpBmpInfo->bmiHeader.biCompression = BI_RGB;lpBmpInfo->bmiHeader.biSizeImage = 0;lpBmpInfo->bmiHeader.biClrUsed = 0;lpBmpInfo->bmiHeader.biWidth = bmp.bmWidth;lpBmpInfo->bmiHeader.biHeight = bmp.bmHeight;HDC dc = CreateCompatibleDC(NULL);// 创建新图片LPVOID lpBits;hbmp24 =::CreateDIBSection(dc,lpBmpInfo,DIB_RGB_COLORS,&lpBits,NULL,0);DeleteDC(dc);delete lpBmpInfo;if (hbmp24 == NULL)// Errorreturn FALSE;holdbmp24 = (HBITMAP)SelectObject(dcImage24, hbmp24);// 将原图片绘制到24色位图中BitBlt(dcImage24, 0, 0, bmp.bmWidth, bmp.bmHeight, dcImage, 0, 0, SRCCOPY);// 创建Mask位图hbmpTrans = CreateBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1, NULL);if (hbmpTrans == NULL)// Errorreturn FALSE;// 选择mask位图到dcTrans中holdbmpTrans = (HBITMAP)SelectObject(dcTrans, hbmpTrans);// 创建掩码图像(基于指定的颜色)COLORREF oldbkcolor = SetBkColor(dcImage24, colorTrans);BitBlt(dcTrans, 0, 0, bmp.bmWidth, bmp.bmHeight, dcImage24, 0, 0, SRCCOPY);SetBkColor(dcImage24, RGB(0,0,0));COLORREF oldtextcolor = SetTextColor(dcImage24, RGB(255,255,255));BitBlt(dcImage24, 0, 0, bmp.bmWidth, bmp.bmHeight, dcTrans, 0, 0, SRCAND);// 去除指定的颜色COLORREF crOldBack, crOldText;crOldBack = SetBkColor(hdc, RGB(255,255,255));crOldText = SetTextColor(hdc, RGB(0,0,0));// 显示透明位图StretchBlt(hdc, rect.left, rect.top, rect.right - rect.left,rect.bottom - rect.top,dcTrans, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCAND);StretchBlt(hdc, rect.left, rect.top, rect.right - rect.left,rect.bottom - rect.top,dcImage24, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCPAINT);// 恢复设置及释放资源SelectObject(dcImage, holdbmp);SelectObject(dcImage24, holdbmp24);SelectObject(dcTrans, holdbmpTrans);DeleteObject(hbmp24);DeleteObject(hbmpTrans);SetBkColor(hdc, crOldBack);SetTextColor(hdc, crOldText);SetBkColor(dcImage24, oldbkcolor);SetTextColor(dcImage24, oldtextcolor);DeleteDC(dcImage);DeleteDC(dcImage24);DeleteDC(dcTrans);return TRUE;}。
24位bmp彩色图转换为24位灰度图的方法一、所用到的流处理函数:fstream:可同时进行读写操作的文件类;或ofstream:写操作(从内存中读数据到文件)的文件类;ifstream:读操作(从文件读数据到内存)的文件类。
二、位图文件的格式:①位图文件头,所用结构体:BITMAPFILEHEADER,占14个字节②位图信息头,所用结构体:BITMAPINFOHEADER,占40个字节③颜色表项,所用结构体:RGBQUAD,由biBitCount值决定④数据区,当结构体BITMAPINFOHEADER中的成员变量biBitCount = 1时,1个字节代表8个像素;biBitCount = 2时,1个字节代表2个像素;biBitCount = 8时,1个字节代表1个像素;biBitCount = 16时,2个字节代表1个像素;biBitCount = 24时,3个字节代表1个像素;RGBQUAD结构体的定义如下:typedef struct tagRGBQUAD {BYTE rgbBlue; // 蓝色分量BYTE rgbGreen; // 绿色分量BYTE rgbRed; // 红色分量BYTE rgbReserved; // 保留值,必须为0.} RGBQUAD;即一个RGBQUAD结构体占4个字节,当biBitCount = 1,2,4,8时,颜色表项分别占2,4,16,256个RGBQUAD 结构体大小的空间;当biBitCount = 24时,③颜色表项不占空间,即位图文件只有①②④三项,这是因为数据区中3个字节代表一个像素,本身含有三原色分量值。
三、需要注意的问题:1. bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp 文件,数据区前三个字节代表位图左下角第一个元素;2. bmp文件存储的图片数据每行所占的字节数都是4的整数倍,不够的用0补充,所以有biSizeImage = ((((bi.Width*bitBitCount)+31)&~31)/8)*bi.biHeight3. 对于24位bmp文件,若图片每行像素所占字节数满足是4的整数倍这个条件,由于BITMAPFILEHEADER和BITMAPINFOHEADER所占的总字节数为54,不是4的倍数,所以补0后为56字节。
透明背景bmp文件的制作方法
目的:
在mtk的平台中,有些平台的代码在使用信号棒和电池状态显示的时候,使用的是bmp文件,这就要求设计人员在设计图片的时候,必须把透明色这种情况给考虑进去,否则的话,将会使做出来的状态栏图标把背景覆盖掉,非常难看
所用工具:
1:画图工具(微软自带的图像处理工具,比较简单,主要用来打开图像然后把图像拷贝到内存中去
2:vc++6.0,(微软的开发工具)
实现过程:
题外说明:我们用一个例子来说明,使用的例子图片是信号棒的一个图片
1.用画图工具打开图片,如下图所示:
2.选中图片,并拷贝,然后打开vc的图片编辑工具
3.在vc中,选中底色为rgb值为0,255,255,然后用底色填充整个图面,之后,将复制的图片粘贴在该图片区域,
4.使用rgb值为0,0,0的颜色在图面上画过的区域,就是在模拟器上透明显示的区域。
32×32的24位bmp位图转换为24位ico图标
2009年03月03日星期二 10:25
不需任何控件和外部函数,单击窗体,输入bmp文件名和ico文件名就完成了,如果输入的文件名错误,将取消转换
Private Sub Form_Click()
On Error GoTo cancel
icoHead = Array(0, 0, 1, 0, 1, 0, 32, 32, 0, 0, 1, 0, 24, 0, 168, 12, 0, 0, 22, 0, 0, _
0, 40, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 128, 12)
Dim bmp(3125) As Byte, ico(3261) As Byte
begin:
bmpfile = InputBox("请输入要转换的bmp文件名(全路径)")
n = FileLen(bmpfile)
Open bmpfile For Binary As #1
Get #1, , bmp
Close #1
If bmp(18) <> 32 Or bmp(22) <> 32 Or n <> 3126 Then
m2 = MsgBox("文件不是32×32的24位位图,是否重新选择?", vbYesNo + 32)
If m2 = vbNo Then GoTo cancel
GoTo begin
End If
For i = 0 To 43
ico(i) = icoHead(i)
Next i
For i = 62 To 3133
ico(i) = bmp(i - 8)
Next i
AutoRedraw = True
ScaleMode = 3
Picture = LoadPicture(bmpfile) '在窗体上显示位图文件
For y = 31 To 0 Step -1
For x = 0 To 31 Step 8
For b = 0 To 7
ico(i) = ico(i) + 2 ^ (7 - b) * (-(Point(x + b, y) = RGB(192, 192, 192))) '把位图中颜色为RGB(192,192,192)的像素转换为透明
Next b
i = i + 1
Next x
Next y
icofile = InputBox("请输入要保存的ico文件名(全路径)")
Open icofile For Binary As #1
Put #1, , ico
Close #1
MsgBox "32×32的24位位图" & vbCrLf & bmpfile & vbCrLf & _
"已成功转换为24位图标" & vbCrLf & icofile, 64
MousePointer = 99 '这两句把转换成的图标作为窗体的鼠标图标,以查看效果
MouseIcon = LoadPicture(icofile)
Exit Sub
cancel:
MsgBox "转换被取消", 64
End Sub
转换原理:
宽和高都不小于4的24位位图,文件的前36个字节(第0~35字节)是24位位图的标记,其中第15~18字节记录着图片的宽度,第19~22字节记录着图片的高度,设首字节为第0字节,第i 字节的值为bmp(i),则对于宽和高都小于65536的24位位图,宽=bmp(17)*256+bmp(18),高
=bmp(21)*256+bmp(22),第36~53这18个字节不影响图片效果,文件的第54字节往后,每3个字节(24位)对应一个像素,所以文件大小为(54+宽*高*3)字节.32×32的24位位图文件大小为3126字节(记为第0~3125字节),前36个字节是
66,77,54,12,0,0,0,0,0,0,54,0,0,0,40,0,0,0,32,0,0,0,32,0,0,0,1,0,24,0,0,0,0,0,0,12 32×32的24位ico图标文件至少3262字节(记为第0~3261字节),前44个字节(第0~43字节)是32×32的24位ico图标的标记,第44~61这18个字节不影响图标效果,第62~3133这3072个字节(3072*8=32*32*24)每3个字节(24位)对应一个像素,记录着所有像素的颜色,这与32×32的24位位图的第54~3125字节的对应规则一致,第3134~3261这128字节(1024
位,128*8=32*32)每位对应一个像素,记录着每个像素是否透明,如果某个像素在这128字节中对应的那一位是1,表示该像素透明,是0则表示不透明.32×32的24位ico图标的前44个字节是0,0,1,0,1,0,32,32,0,0,1,0,24,0,168,12,0,0,22,0,0,0,
40,0,0,0,32,0,0,0,64,0,0,0,1,0,24,0,0,0,0,0,128,12。