缩放带有透明色的GIF图像

一直在找透明GIF图像的处理方法,在jillzhang的提示之下,看到了一篇文章,其中的一段对位图转换的解释让人豁然开朗,真是相见恨晚啊。在此我把核心部分代码拿了出来,以作学习研究之用。由于我对图像操作不是很了解,所以不怎么看得懂这段代码,还请有经验的大大们指教。

作者在文中说:

  • 如果把8位的透明PNG图像装进Image里,那它将转化成32位的图像格式,并丢失调色板和透明信息。
  • 如果把8位的透明GIF图像装进Image里,那它图像格式不变,并保留调色板和透明信息。
  • 如果把4位的透明GIF图像装进Image里,那它将转化成8位的图像格式,16位的调色板(16 entries palette,16位的?)将保留。
  • 如果用GetThumbnailImage方法来缩略8位的透明GIF图像,将生成24位的PNG缩略图,并丢失透明信息。

作者文中提供了一种缩放透明GIF的方法:

  • 把原图片加载进Bitmap。
  • 新建一个目标Bitmap,大小是缩放后的大小,PixelFormat和Palette与原图片的一样。
  • 然后在目标图像中逐像素的去找相应位置上原图像的信息。

程序的后面为了提高效率,使用的是指针操作,哪位能看懂的还请指教,先谢拉。部分代码如下:

unsafe
{
    byte* p = (byte*)(void*)targetScan0;
    int nOffset = targetStride - scaledBitmap.Width;

    for (int y = 0; y < scaledBitmap.Height; ++y)
    {
        for (int x = 0; x < scaledBitmap.Width; ++x)
        {
            p[0] = ((byte*)((int)sourceScan0 + (int)(Math.Floor(y * yFactor) * sourceStride) + (int)Math.Floor(x * xFactor)))[0];
            ++p;
        }
        p += nOffset;
    }
}

由于用到了指针,所以在编译时要设置允许非安全代码,在Web.config中也要加上compilerOptions="/unsafe"设置。还有哪位知道关于位图的操作应该看些什么方面的资料,也共享一下吧,谢谢。

posted on 2008-02-19 15:01  Superstone  阅读(2084)  评论(3编辑  收藏  举报

导航