asp.net生成透明GIF图片的方法(3)
1public void Save(string filename, ImageFormat format)
2{
3 if (format == null)
4 {
5 throw new ArgumentNullException("format");
6 }
7 ImageCodecInfo encoder = format.FindEncoder();
8 if (encoder == null) //这里比保存到流多了个判断!
9 {
10 encoder = ImageFormat.Png.FindEncoder();
11 }
12 this.Save(filename, encoder, null);
13}
14
15public void Save(Stream stream, ImageFormat format)
16{
17 if (format == null)
18 {
19 throw new ArgumentNullException("format");
20 }
21 ImageCodecInfo encoder = format.FindEncoder();
22 //这里没有那个获取默认编码器的步骤!!!
23
24 this.Save(stream, encoder, null);
25}
26
27
28
29
30
OK,既然是这样,那么我就在外面调用一下那个传说中的 ImageFormat.Png.FindEncoder();
不就得了吗?你要是这样想那就太天真了:
1internal ImageCodecInfo FindEncoder()
2{
3 foreach (ImageCodecInfo info in ImageCodecInfo.GetImageEncoders())
4 {
5 if (info.FormatID.Equals(this.guid))
6 {
7 return info;
8 }
9 }
10 return null;
11}
看到了吧,FindEncoder()方法是internal的 -______-,瀑布汗啊瀑布汗
不过还好,天无绝人之路,Save还有一个重载:
public void Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
我们可以直接传Png的ImageCodecInfo进去,嘿嘿,我们可以把png的ImageCodeInfo给穷举找出来!
1Private Shared Function GetEncoderInfo()Function GetEncoderInfo(ByVal mimeType As String) As Imaging.ImageCodecInfo
2 For Each ecoder In Imaging.ImageCodecInfo.GetImageEncoders()
3 If ecoder.MimeType = mimeType Then
4 Return ecoder
5 End If
6 Next
7 Return Nothing
8 End Function
至此,我们终于制作了一个可以在IE6中拥有透明背景色的"gif"图像,不过实际上,这个其实不是gif格式的,实际上
是8位色png格式的,不过不管怎么说,这个好歹可以在IE6里透明了,而且使用上没有区别。除了不能动画,汗。
最后的实现代码:
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)
23 Dim trg = gif2.LockBits(New Rectangle(0, 0, gif2.Width, gif2.Height), Imaging.ImageLockMode.WriteOnly, gif2.PixelFormat)
24
25 Dim bits(src.Stride * src.Height - 1) As Byte
26 System.Runtime.InteropServices.Marshal.Copy(src.Scan0, bits, 0, bits.Length)
27 System.Runtime.InteropServices.Marshal.Copy(bits, 0, trg.Scan0, bits.Length)
28
29 gif.UnlockBits(src)
30 gif2.UnlockBits(trg)
31
32
33
34 Dim ms As New System.IO.MemoryStream()
35
36 gif2.Save(ms, GetEncoderInfo("image/png"), Nothing)
37 gif2.Dispose()
38
39 Dim gif3 = Bitmap.FromStream(ms)
40
41 Me.PictureBox2.Image = gif3
42
最终正确的结果: