龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

asp.net生成透明GIF图片的方法(3)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
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 == n

 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
最终正确的结果:

代码下载


精彩图集

赞助商链接