BMP位图透明格式的详解制作教程-推荐下载
BMP图片文件详解
有一个长宽各为 200 个象素,颜色数为 16 色的彩色图,每一个象素都用 R,G,B 三个分 量表示,因为每个分量有 256 个级别,要用 8 位( bit),即一个字节(byte)来表示,所以每个象素需要用 3 个字节。整个图象要用 200*200*3, 约 120k 字节,可不是一个小数目呀! 如果我们用下面的方法, 就能省的多。 因为是一个 16 色图,也就是说这幅图中最多只有 16 种颜色,我们可以用一个表:表中的每 一行记录一种颜色的 R,G,B 值。这样当我们 表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例 子,如果表的第 0 行为 255,0,0(红色) ,那么当某个象素为
色时,只需要标明 0 即可。 让我们再来计算一下:16 种状态可以用 4 位(bit)表示,所以 一个象素要用半个字节。整个图象要用 200*2 00*0.5,约 20k 字节,再加上表占用的字节为 3*16=48 字节.整个占用的字节数约为前面的 1/6,省很多吧。 这 张 RGB 的 表 , 即 是 我 们 常 说 的 调 色 板 (Palette) , 另 一 种 叫 法 是 颜 色 查 找 表 LUT(LookUpTable),似乎更确切一些。Windows 位图中便用
biXPelsPerMeter 指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念,我们将在打印部 分详细介绍。
biYPelsPerMeter 指定目标设备的垂直分辨率,单位同上。
biClrUsed 指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为 2 的 biBitCount 次方。
biSizeImage 指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:
(一)制作透明图
使用Lview Pro介紹(一)製作透明圖在WWW上可以看到許多漂亮的圖片,其中有許多是經過加工製作成透明圖,也就是利用MASK的功能(或稱為XOR),將同樣的顏色變成看不見,與背景色完全結合,以增加美觀, 更具吸引力..... 實際上有許多繪圖軟體都可以製作透明圖﹐例如﹕著名的Photo Shop﹑Core Draw以及一些很好有的Shareware﹐如Lview Pro﹑GIF Construction Set等等。
基本的技巧在於Exclusion OR (XOR)的觀念﹐也就是利用遮罩(mask)將一樣的顏色互補﹐就等於沒有顏色了。
例如﹐如果有一張圖片的底色是純白色(假設代號為15﹐2進位碼為1111)﹐它的遮罩顏色就必須是純白色的1111。
下表就是以簡單的理論來介紹透明圖的相關知識﹐何謂XOR的概念﹐然後再談何謂遮罩(mask)的概念。
X Y X AND Y X OR Y X XOR Y1 1 1 1 01 0 0 1 10 1 0 1 10 0 0 0 0上表中有三種邏輯運算子AND﹑OR及XOR﹐為簡單說明可以把「0」當作「不可見」﹐而「1」為「可見」﹕x和y必須都是「可見」時AND的結果才會是「可見」﹔x和y只要有一個是「可見」時OR的結果就會是「可見」﹔當x和y不一樣時﹐XOR的結果就為「可見」﹐當x和y完全一樣時﹐其結果就是「不可見」。
而遮罩(mask)的概念就是延申XOR的概念﹐就像是過濾器一樣﹐例如有個圖的每一點都是由4-bit所組成﹐也就是每一點都可以有2的4次方=16色﹐如果遮罩(mask)的顏色為1111﹐那麼原來的圖所有的1111就會變成0000﹐如果剛好是這張圖的背景顏色﹐那麼貼到Browser 來看﹐就像是去掉背景的透明圖﹐所以不論把這張圖放到那種底圖上﹐都不會蓋掉原有的色彩。
如果以上淺顯的理論不懂也沒關係﹐只要找到合適的去背景軟體﹐或是按照以下的步驟說明﹐就可以很容易完成你的作品。
设置图片透明度的四种方法
设置图片透明度的四种方法设置图片透明度的四种方法分类: GDI+ 2011-07-24 01:13 121人阅读评论(0) 收藏举报方法一:像素法即循环扫描整张图片,设置每一个像素的Alpha通道的值。
由于是一个个像素的处理,所以这种方法效率很低。
[csharp]view plaincopy?1./// <summary>2./// 设置图片的透明度3./// </summary>4./// <param name="bitmap">原图</param>5./// <param name="alpha">透明度(0-255之间)</param>6./// <returns></returns>7.public static Bitmap SetBitmapAlpha(Bitmap bitmap, int a lpha)8.{9.Bitmap bmp = (Bitmap)bitmap.Clone();10.Color color;11.for (int x = 0; x < bmp.Width; x++)12.{13.for (int y = 0; y < bmp.Height; y++)14.{15.color = bmp.GetPixel(x, y);16.bmp.SetPixel(x, y, Color.FromArgb(alpha, color));17.}18.}19.20.bitmap.Dispose();21.return bmp;22.}方法二:内存法[csharp]view plaincopy?1.public static Bitmap SetBitmapAlpha(Bitmap bitmap, int a lpha)2.{3.Bitmap bmp = (Bitmap)bitmap.Clone();4.5.Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.He ight);6.System.Drawing.Imaging.BitmapData bmpData =7.bmp.LockBits(rect, System.Drawing.Imaging.ImageLockM ode.ReadWrite,8.PixelFormat.Format32bppArgb);9.10.IntPtr ptr = bmpData.Scan0; //获取首地址11.int bytes = Math.Abs(bmpData.Stride) * bmp.Height;12.byte[] argbValues = new byte[bytes];13.14.//复制ARGB的值到数组15.System.Runtime.InteropServices.Marshal.Copy(ptr, arg bValues, 0, bytes);16.17.for (int count = 3; count < argbValues.Length; count + = 4)18.{19.//设置alpha通道的值20.argbValues[count] = (byte)alpha;21.}22.23.System.Runtime.InteropServices.Marshal.Copy(argbVal ues, 0, ptr, bytes);24.bmp.UnlockBits(bmpData);25.26.27.bitmap.Dispose();28.return bmp;29.}方法三:指针法[csharp]view plaincopy?1.public static Bitmap SetBitmapAlpha(Bitmap bitmap, int a lpha)2.{3.Bitmap bmp = (Bitmap)bitmap.Clone();4.5.Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.He ight);6.BitmapData bmpData = bmp.LockBits(rect,7.ImageLockMode.ReadWrite, PixelFormat.Format32bppAr gb);8.9.unsafe10.{11.byte* p = (byte*)bmpData.Scan0;12.int offset = bmpData.Stride - bmp.Width * 4;13.for (int y = 0; y < bmp.Height; y++)14.{15.for (int x = 0; x < bmp.Width; x++)16.{17.//设置alpha通道的值18.p[3] = (byte)alpha;19.p += 4;20.}21.p += offset;22.}23.}24.25.bmp.UnlockBits(bmpData);26.bitmap.Dispose();27.28.return bmp;29.}方法四:矩阵法这个方法的效率最高。
BMP图片格式详解
BMP图像格式详解一.简介BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。
Windows系统内部各图像绘制操作都是以BMP为基础的。
Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。
Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。
BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
二.BMP格式结构BMP文件的数据按照从文件头开始的先后顺序分为四个部分:◆位图文件头(bmp file header):提供文件的格式、大小等信息◆位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息◆调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表◆位图数据(bitmap data):图像数据区BMP图片文件数据表如下:三.BMP文件头BMP文件头结构体定义如下:typedef struct tagBITMAPFILEHEADER{UINT16 bfType; //2Bytes,必须为"BM",即0x424D 才是Windows位图文件DWORD bfSize; //4Bytes,整个BMP文件的大小UINT16 bfReserved1; //2Bytes,保留,为0UINT16 bfReserved2; //2Bytes,保留,为0DWORD bfOffBits; //4Bytes,文件起始位置到图像像素数据的字节偏移量} BITMAPFILEHEADER;BMP文件头数据表如下:四.BMP信息头BMP信息头结构体定义如下:typedef struct _tagBMP_INFOHEADER{DWORD biSize; //4Bytes,INFOHEADER结构体大小,存在其他版本INFOHEADER,用作区分LONG biWidth; //4Bytes,图像宽度(以像素为单位)LONG biHeight; //4Bytes,图像高度,+:图像存储顺序为Bottom2Top,-:Top2BottomWORD biPlanes; //2Bytes,图像数据平面,BMP存储RGB数据,因此总为1 WORD biBitCount; //2Bytes,图像像素位数DWORD biCompression; //4Bytes,0:不压缩,1:RLE8,2:RLE4DWORD biSizeImage; //4Bytes,4字节对齐的图像数据大小LONG biXPelsPerMeter; //4 Bytes,用象素/米表示的水平分辨率LONG biYPelsPerMeter; //4 Bytes,用象素/米表示的垂直分辨率DWORD biClrUsed; //4 Bytes,实际使用的调色板索引数,0:使用所有的调色板索引DWORD biClrImportant; //4 Bytes,重要的调色板索引数,0:所有的调色板索引都重要}BMP_INFOHEADER;BMP信息头数据表如下:五.BMP调色板BMP调色板结构体定义如下:typedef struct _tagRGBQUAD{BYTE rgbBlue; //指定蓝色强度BYTE rgbGreen; //指定绿色强度BYTE rgbRed; //指定红色强度BYTE rgbReserved; //保留,设置为0 } RGBQUAD;1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据,即调色板最多只需要256项(索引0 - 255)。
24位bmp位图转换为24位ico图标(透明效果)
32×32的24位bmp位图转换为24位ico图标2009年03月03日星期二 10:25不需任何控件和外部函数,单击窗体,输入bmp文件名和ico文件名就完成了,如果输入的文件名错误,将取消转换Private Sub Form_Click()On Error GoTo cancelicoHead = 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 Bytebegin:bmpfile = InputBox("请输入要转换的bmp文件名(全路径)")n = FileLen(bmpfile)Open bmpfile For Binary As #1Get #1, , bmpClose #1If bmp(18) <> 32 Or bmp(22) <> 32 Or n <> 3126 Thenm2 = MsgBox("文件不是32×32的24位位图,是否重新选择?", vbYesNo + 32)If m2 = vbNo Then GoTo cancelGoTo beginEnd IfFor i = 0 To 43ico(i) = icoHead(i)Next iFor i = 62 To 3133ico(i) = bmp(i - 8)Next iAutoRedraw = TrueScaleMode = 3Picture = LoadPicture(bmpfile) '在窗体上显示位图文件For y = 31 To 0 Step -1For x = 0 To 31 Step 8For b = 0 To 7ico(i) = ico(i) + 2 ^ (7 - b) * (-(Point(x + b, y) = RGB(192, 192, 192))) '把位图中颜色为RGB(192,192,192)的像素转换为透明Next bi = i + 1Next xNext yicofile = InputBox("请输入要保存的ico文件名(全路径)")Open icofile For Binary As #1Put #1, , icoClose #1MsgBox "32×32的24位位图" & vbCrLf & bmpfile & vbCrLf & _"已成功转换为24位图标" & vbCrLf & icofile, 64MousePointer = 99 '这两句把转换成的图标作为窗体的鼠标图标,以查看效果MouseIcon = LoadPicture(icofile)Exit Subcancel:MsgBox "转换被取消", 64End 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。
图像的透明背景制作很容易
图像的透明背景制作很容易,许多个人主页上都有介绍。
用透明背景的图像的好处不仅仅在于好看,更重要的是它的字节数小,并且在download时,是交错显示!我们来看看下面的例子就清楚了。
非透明背景(7K)透明背景(1K)透明背景图通常指的是GIF89A 格式的图片,它的制作很简单,许多图像工具都可以做到。
我介绍一下用Photoshop制作透明背景的图片的步骤。
1。
首先打开图像,选择Image菜单下mode下的indexed color...转换图像格式。
2。
选择File菜单下的Export的第一项:GIF89a Export,跳出一个Options窗口,用吸管在背景上点一下(或者在调色板上选取需要的一种颜色,在图像背景上点一下),选OK,储存既可。
文章二:1. 打开你要处理的图片(可以是任何格式的),先调整它的尺寸大小,这一点虽然与透明背景图像没有什么联系,但图像太大会影响浏览速度,谁想只为了看一幅图片而“等你等得我心疼”呢!所以,在不影响视觉效果前提下应把图像尽量缩小,而且图像的长宽要和它在网页中的大小基本一致,否则图像插入后会发生变形。
调节尺寸可用(图像)菜单中的(图像尺寸)命令。
2. 用磁性套索工具选定需要的部分,这一步是为了把所需图像同原图中的不透明背景分离开来。
这个工具对于选定与背景颜色反差较大的部分非常方便,但也需要一定耐心,才能把所需图像完整地选下来。
然后使用“Edit(编辑)”菜单项中的“Copy(复制)”命令,把所选的内容复制到剪贴板中。
3. 使用“File(文件)”菜单中的“New(新建)”命令新建一图像。
尺寸使用对话框中的默认值,这是系统根据剪贴板中的数据给出的最小值。
在“Contents”这一栏中,一定要把“Transparent(透明)”项选中,这是是否能生成透明背景图像的关健。
单击“OK”后,如果不出意外的话,你会看见一幅有网格的新图像,其实这是一幅背景透明的空白图像。
4. 用“Edit(编辑)”菜单中的“Paste(粘贴)”命令把剪贴板的内容粘贴到新图像中,在左边的工具栏中选择移动工具,把图像移到合适的位置。
BMP图像格式详解
BMP格式图像文件详析首先请注意所有的数值在存储上都是按“高位放高位、低位放低位的原则”,如12345678h放在存储器中就是7856 3412)。
下图是导出来的开机动画的第一张图加上文件头后的16进制数据,以此为例进行分析。
T408中的图像有点怪,图像是在电脑上看是垂直翻转的。
在分析中为了简化叙述,以一个字(两个字节为单位,如424D就是一个字)为序号单位进行,“h”表示是16进制数。
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2......BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
一、图像文件头1)1:图像文件头。
424Dh=’BM’,表示是Windows支持的BMP 格式。
2)2-3:整个文件大小。
4690 0000,为00009046h=36934。
3)4-5:保留,必须设置为0。
4)6-7:从文件开始到位图数据之间的偏移量。
4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。
8000 0000,为00000080h=128。
7)12-13:位图高度,以像素为单位。
9000 0000,为00000090h=144。
8)14:位图的位面数,该值总是1。
0100,为0001h=1。
二、位图信息头9)15:每个像素的位数。
透明贴图实现
透明贴图绘制透明位图是指在绘制位图时只绘制除了指定颜色外的其余部分,而指定的颜色就被称为“透明色”。
通过将位图的背景色指定成“透明色”,在绘制时不绘制带“透明色”的这部分背景,仅绘制图像,这样就可以将图像透明地绘制到窗口上。
绘制包含透明色的位图的方法有许多种,比较常用的是屏蔽绘制和非屏蔽绘制,屏蔽绘制指的是事先做一张掩码位图,非屏蔽绘制是动态生成掩码位图。
下面将分别详细介绍这两种绘制方法。
在写透明贴图的方法前先来说说透明贴图,所谓的透明贴图并不是真正意义上的透明,而是图像不需要显示的部分显示出的颜色是当前对话框的背景色,也就是说把图像不需要显示的颜色当成背景色,显示的部分作为前景色,透明就是把背景换成对话框背景。
要实现这种透明有两种方法,一种是让背景色成为白色,然后与对话框背景色进行与运算;还有一种是让背景色成为黑色,然后与对话框背景色进行或运算。
这样位图的背景色就消失了。
了解了透明的概念,就可以避免透明贴图的一些缺点,如果位图的前景色也存在许多白色,则采用将背景色变成黑色,与对话框背景色进行或运算的方法,这样前景色的白色部分才不会被误当成背景色透明显示;反过来,如果位图前景色存在大量黑色部分是,则采用将背景色变成白色,与对话框背景色进行与运算的方法。
当然,如果前景色同时存在大量白色和黑色时,则透明贴图会遇到大麻烦,需要想办法将位图的白色或黑色部分做一些修改后再进行透明贴图。
屏蔽绘制绘制透明位图的关键就是创建一个“掩码”位图(mask bitmap),这个“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。
在MFC中,绘图需要使用设备描述表,透明贴图时需要创建两个内存设备描述表,一个是用于存放位图的设备描述表(imgDC),一个是用于存放“掩码”位图的设备描述表(maskDC)。
在“掩码”位图设备描述表中制作“掩码”位图的方法是先创建一个单色的bitmap,放入掩码设备描述表(maskDC)中,然后使用拷贝粘贴的方式将存放有位图的设备描述表(imgDC)绘制到掩码设备描述表上,这样,掩码设备描述表显示的位图即是“掩码”位图。
MFC下实现位图的透明色显示
MFC下实现位图的透明色显示透明位图的显示作者:王骏包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数:TransparentBlt,也可以通过自己的代码实现类似 TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另一种是动态生成掩码位图。
本文将介绍动态生成掩码位图绘制具有透明区域位图的方法。
一、TransparentBlt 函数的使用TransparentBlt 函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接 Msimg32.lib。
Windows98下的TransparentBlt会产生资源泄漏,所以不建议在WIN98下使用该函数。
TransparentBlt函数原型如下:BOOL TransparentBlt(HDC hdcDest, // 目标DCint nXOriginDest, // 目标X偏移int nYOriginDest, // 目标Y偏移int nWidthDest, // 目标宽度int hHeightDest, // 目标高度HDC hdcSrc, // 源DCint nXOriginSrc, // 源X起点int nYOriginSrc, // 源Y起点int nWidthSrc, // 源宽度int nHeightSrc, // 源高度UINT crTransparent // 透明色,COLORREF类型);使用示例:CBitmap FootballBMP;FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);CDC ImageDC;ImageDC.CreateCompatibleDC(pDC);CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff)); ImageDC.SelectObject(pOldImageBMP);二、实现TransparentBlt函数为了理解具有透明色位图的绘制过程,我们来亲手建立一个具有同TransparentBlt功能一致的实验函数,称之为TransparentBlt2。
真确显示透明位图
网上已经有了不少地关于如果透明显示位图的文档,但是这些文章中有一个非常大的缺陷,如果当一个位图并不是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;}。
透明位图
透明位图透明位图透明位图Ron GeryMicrosoft 网络开发技术小组摘要这篇文章讨论了在Microsoft Windows图形环境中用位图达到透明和屏蔽效果的几种方法,包括通过仿真和使用特殊的驱动器功能。
包含其中的一个小样本应用程序TRANSBLT详细阐明了这篇文章讨论的大多数方法。
介绍使用透明(TRANSPARENT)背景模式(用SetBrMode函数设置),一个应用程序就可以用透明文本,透明风格的线条和透明形状的刷子。
令人悲伤的是,Microsoft Windows图形环境并没有为透明位图提供一个简单的接口。
(是的,它提供了,但是并没有对它进行广泛的支持,就象在下文中“容易的位图透明性”中提到的)。
幸运的是,通过使用一个屏蔽位图和几次调用具有经过仔细选择的光栅操作的BitBlt,一个应用出现可以模仿这种效果。
到底什么是透明的位图呢?它是一个位图,通过它目的文件的一部分仍然可以看得见。
一个简单的例子就是类似于控制面板图象等基于Windows的图象。
控制面板图象本身基本上是个长方形。
当它被最小化时,通过这个长方形图象位图的部分可以看见桌面。
从理想化的角度讲,这图象位图被设计成长方形其中有些象素被指定为透明的以至于当位图被使用,那些象素就不会挡住目的文件。
透明的位图可以通过移动的、非矩形图象变得更为有趣。
下面将要描述得模仿方式可以用来完成这些透明效果。
符号这篇文章使用透明和不透明这两个词来描绘源位图中得象素。
透明象素是那些不会影响目标文件的象素。
不透明象素是那些画在目标文件上并取代该位置上原来的东西的象素。
白色和黑色分别被假定为全1和全0的值。
这在所有已知的Windows 显示驱动器上都是正确的,包括调色板设备。
基本的操作涉及到从源文件到目标文件的块传递,额外的与单色屏蔽有关的块传递也是需要的。
源文件和目标文件棗由他们的设备上下文代表棗hdcSrc和hdcDest即可以是位图也可以是设备表面本身。
透明位图
1、实现原理计算机视频系统核心是内存,位图操作涉及到视频内存和位图内存。
每次以及每一个图形操作都会影响视频内存,位图内存为一块类似于视频内存的RAM区域,它代表一个容纳数据的内存地址,二者极为相识,区别在于位图内存看不到,而视频内存看的到。
位图驻留在位图内存中,如果被移到视频内存,则将显示在监视器上。
2、实现方法绘制透明位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为透明色。
通过将位图的背景色指定为透明色,在绘制时,不绘制这部分背景,而仅绘制图像,这样就可以将位图中图像透明地绘制到窗口上。
如下图1所示。
图1 位图透明显示事例绘制透明位图的关键是创建一个掩码位图,掩码位图是一个单色位图,它是位图中图像的一个单色剪影。
在Windows编程中,绘图都要用到设备描述表,需创建两个内存设备描述表:源位图设备描述表和掩码位图设备描述表。
源位图设备描述表用来装入源位图,而掩码位图设备描述表用来装入掩码位图。
使用BitBlt执行相应光栅操作,将源位图透明地绘制在目的位图上。
在目的位图上实现源位图透明显示步骤:(1)首先,源位图与掩码位图进行SRCPAINT操作,即使用布尔OR操作将二者组合在一起;(2)其次,目的位图与掩码位图进行MERGEPAINT操作,即使用布尔OR操作将取反后的掩码位图与目的位图组合在一起;(3)最后,目的位图与源位图进行SRCAND操作,即使用布尔AND操作将二者组合在一起。
3、位图透明显示流程(1)将位图装载到CBitmap对象;(2)创建一个与视频设备描述表兼容的位图设备描述表;(3)将CBitmap对象选入最新创建的设备描述表中;(4)使用GetObject()填写BITMAP结构,以使了解位图大小;(5)源位图与掩码位图进行BitBlt(),使用SRCPAINT光栅操作码,将二者合在一起,此部处理源位图;(6)目的位图与掩码位图进行BitBlt(),使用MERGEPAINT光栅操作码,将二者合在一起;(7)目的位图与掩码位图进行BitBlt(),使用SRCAND光栅操作码,实现源位图透明显示。
bmp文件格式详解
BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。
由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。
Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。
下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:➢bmp文件头(bmp file header):提供文件的格式、大小等信息➢位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息➢调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表➢位图数据(bitmap data):就是图像数据啦^_^下面结合Windows结构体的定义,通过一个表来分析这四个部分。
我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。
因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。
这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。
下面针对一幅特定的图像进行分析,来看看在位图文件中这四个数据段的排布以及组成。
我们使用的图像显示如下:这是一幅16位的位图文件,因此它是含有调色板的。
在拉出图像数据进行分析之前,我们首先进行几个约定:1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。
透明背景bmp文件的制作方法
透明背景bmp文件的制作方法
目的:
在mtk的平台中,有些平台的代码在使用信号棒和电池状态显示的时候,使用的是bmp文件,这就要求设计人员在设计图片的时候,必须把透明色这种情况给考虑进去,否则的话,将会使做出来的状态栏图标把背景覆盖掉,非常难看
所用工具:
1:画图工具(微软自带的图像处理工具,比较简单,主要用来打开图像然后把图像拷贝到内存中去
2:vc++6.0,(微软的开发工具)
实现过程:
题外说明:我们用一个例子来说明,使用的例子图片是信号棒的一个图片
1.用画图工具打开图片,如下图所示:
2.选中图片,并拷贝,然后打开vc的图片编辑工具
3.在vc中,选中底色为rgb值为0,255,255,然后用底色填充整个图面,之后,将复制的图片粘贴在该图片区域,
4.使用rgb值为0,0,0的颜色在图面上画过的区域,就是在模拟器上透明显示的区域。
BMP位图格式详解
位图格式BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。
它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。
在系统中以BMP为扩展名保存。
打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。
现在讲解BMP的4个组成部分:1.文件头信息块0000-0001 :文件标识,为字母ASCII码“BM”。
0002-0005 :文件大小。
0006-0009 :保留,每字节以“00”填写。
000A-000D :记录图像数据区的起始位置。
各字节的信息含义依次为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。
2.图像描述信息块000E-0011:图像描述信息块的大小,常为28H。
0012-0015:图像宽度。
0016-0019:图像高度。
001A-001B:图像的plane总数(恒为1)。
001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。
0022-0025:图像区数据的大小。
0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。
3.颜色表颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。
其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。
即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。
4.图像数据区颜色表接下来位是位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位;16色图像每点占4位;256色图像每点占8位;真彩色图像每点占24位。
制作软件中使导入的图片背景透明
我们在制作多媒体课件时,有时希望导入的图片背景透明,但很多时候我们想尽了各种办法还是不能实现。
其实,看完了下文,您就会知道,原来透明并不是一件难事。
我们先来看一下,我们常用的课件制作软件中使导入的图片背景透明的一般方法。
1.Authorware在Authorware中,我们对在显示图标中导入的图片设置背景透明的常用的方法是:双击选择工具,然后选择其中的透明(如图1)。
这种方法非常简单,也很方便。
但它的不足之处也是很明显的:我们看图1中的两张小动物的图片,这两幅图片原来的背景都是白色,设置了透明之后,动物的四周围都有白边,并不是很干净。
而且第二张图片中,小章鱼的眼睛本来是白色的,因为白色背景被透明了,结果眼睛也透明了。
而且,用这种方法使背景透明,只对白色背景有效,如果背景是其他颜色背景或者比较复杂,就无能为力了。
图1 Authorware中设置透明2.PowerPoint如果在PowerPoint中对导入的图片设置背景透明,可以把图片工具栏调出来,选择其中的“设置透明色”工具,然后在图片中单击想透明的背景颜色即可(如图2)。
应该说在PowerPoint中设置透明比在Authorware中方便多了,因为它不限定是白色,可以是任何颜色。
但缺点也是有的,一是在一张图片中只能设置一种颜色,第二个缺点与在Authorware中类似,我们从图2中也可以看得出,右边人物的眼睛的颜色因为跟背景色相同,结果也被透明了。
图2 PowerPoint中设置透明3.Flash对于导入的位图,Flash提供的编辑功能很有限。
我们对于导入的图片,如果要使背景透明的话,也不是没办法。
一般情况下,选定导入的图片,然后选择“修改/分离”命令(或直接按下“Ctrl+B”键,即可将导入的图片打散),再用选择工具中的魔术棒工具,选定背景色,将之删除。
如果还有其他的无关背景,可再用橡皮工具将之擦除,这样,可以取得比较好的效果(如图3)。
但这种方法操作比较复杂,而且很费时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*.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(紫色)为透明。