asp.net生成透明gif的准完善筹划[网络技术]
本文“asp.net生成透明gif的准完善筹划[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
我近来在实现我的WMS服务器的时刻,发现了一个超级忧郁的问题,问题描写以下:客户需求动态叠加一个透明层到底图上,比方说公交线路层,这个层有透明后台,于是可以叠加到其他图层上去.利用openlayer动态叠加图层很便利,我想这还不简单,利用透明png不就OK了,测试后果表明,在我机械的IE8上,非常正常.我正暗自得意,另一位兄弟用IE6一看,完蛋了,IE6不支持透明PNG,汗,这下要了命了,赶忙翻openlayers的资料,发现可以针对IE6分外利用透明滤镜.利用办法很便利,只要设置要透明的层 属性 alpha=true便可.测试后发现,透明是透明了,但是由于图片瓦块数过量,招致IE6被拖得半死,反映迟钝.汗,于是我想,那就对线路层利用gif 格局呗,gif不也可以透明后台么.于是,悲剧呈现了.为了讲解清楚,我以一个PLMM为模特,嘿嘿
首先呢,我们预备一个PLMM,嘿嘿:
大家看到PLMM帽子边上的那个黄色圆圈了吗?一会我们就要将它变成透明的,生成一张可以在IE6中透明的GIF图.
首先呢,我们利用通例方法:
1Dim gif1 As New Bitmap("plmm.jpg")
2 gif1.MakeTransparent(Color.Yellow)
3 PictureBox1.Image = gif1
4
5 '这里我将它保存为gif到流里,这里是内存流,在asp.net中则是outputstream ,再显示在picturebox2里
6 Dim ms As New System.IO.MemoryStream()
7 gif1.Save(ms, Imaging.ImageFormat.Gif)
8
9 Dim gif2 = Bitmap.FromStream(ms)
10 ms.Dispose()
11
12 PictureBox2.Image = gif2
13
14 '***变黑了**** 这个后果是非常令人懊丧的:那个圆圈不但没透明,乃至还变成了黑色:
那么假如我直接保存为文件呢?图我就不贴了,和上面一样,还是黑的.
1 Dim gif1 As New Bitmap("plmm.jpg")
2 gif1.MakeTransparent(Color.Yellow)
3 PictureBox1.Image = gif1
4
5 '***直接保存为文件:***
6 gif1.Save("out1.gif", Imaging.ImageFormat.Gif)
7
8 '***还是黑的**********
9 PictureBox2.ImageLocation = "out1.gif"
这是我网上举行了一番搜索,大致上可以搜到这么一个版本:先改正调色板,然后再别的拷贝数据.
大致原理是:GIF是一种索引图象,最大色彩数256色 (PS:其实这个色彩数不少了,想昔时,我上学时刻常常逃课去玩
世嘉五代 MD游戏机,那个同屏发色数才16色,同期的超级任天堂的同屏发色数也不过256色,呵呵,这些都是从<<电子游戏软件>>里看来的)
GIF有一个调色板,最大有256个颜色索引,然后每个像素保存的是调色板的颜色索引值.故此,只需改正调色板,便可调整
图象的颜色.
OK,那么我们来改下调色板:
1 '***我们读取上一步生成的不透明gif
2 Dim gif As New Bitmap("out1.gif")
3 PictureBox1.Image = gif
4
5 '***获得色板***
6 Dim pal = gif.Palette
7
8 For i As Integer = 0 To pal.Entries.Length - 1
9 Dim color = pal.Entries(i)
10 '***将黑色改成透明,并且玩个反色特效,嘿嘿***
11 If color.R = 0 And color.G = 0 And color.B = 0 Then
12 pal.Entries(i) = color.Transparent
13 Else
14 pal.Entries(i) = color.FromArgb(255, color.B, color.G, color.R)
15 End If
16
17 Next
18
19 Dim gif2 As Bitmap = gif.Clone()
20 gif2.Palette = pal
21
22 PictureBox2.Image = gif
看起来效果不错,纯黑色部份被透明了!并且么,还出来个反色特效,HOHO
不过你不要高兴得太早,假如这时刻你保存的话,它还是黑的!!
这是我们需求利用拷贝位图数据的办法来处理:
1'***我们读取上一步生成的不透明gif
2 Dim gif As New Bitmap("out1.gif")
3 PictureBox1.Image = gif
4
5 '***获得色板***
6 Dim pal = gif.Palette
7
8 For i As Integer = 0 To pal.Entries.Length - 1
9
Dim color = pal.Entries(i)
10 '***将黑色改成透明***
11 If color.R = 0 And color.G = 0 And color.B = 0 Then
12 pal.Entries(i) = color.Transparent
13 End If
14 Next
15
16 '***别的成立一个位图,格局为8位索引色**
17 Dim gif2 As New Bitmap(gif.Width, gif.Height, Imaging.PixelFormat.Format8bppIndexed)
18 '***设置改正后的调色板***
19 gif2.Palette = pal
20 '***拷贝内存
21
22 Dim src = gif.LockBits(New Rectangle(0, 0, gif.Width, gif.Height), Imaging.ImageLockMode.ReadOnly, gif.PixelFormat)
以上是“asp.net生成透明gif的准完善筹划[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |