.NET Framework和Gif透明度

时间:2009-11-25 11:45:52

标签: .net gdi+ wic

在Windows 7(以及新的图像编解码器:WIC)之前,我使用以下(非常快但很脏)的方法来创建一个Gif编码的图像,其中白色为透明色:

MemoryStream target = new memoryStream(4096);
image.Save(target, imageFormat.Gif);
byte[] data = target.ToArray();

// Set transparency
// Check Graphic Control Extension signature (0x21 0xF9)
if (data[0x30D] == 0x21 && data[0x30E] == 0xF9)
   data[0x313] = 0xFF; // Set palette index 255 (=white) as transparent

这种方法很有效,因为.NET用于编码带有标准调色板的Gif,其中索引255是白色。

在Windows 7中,此方法不再起作用。似乎标准调色板已更改,现在索引251为白色。但我不确定。也许新的Gif编码器会根据使用的颜色动态生成调色板?

我的问题:是否有人对Windows 7的新Gif编码器有所了解,哪种方法可以让白色变得透明?

2 个答案:

答案 0 :(得分:3)

我找到了一种更好的方法将白色设置为gif编码图像的透明色。 它似乎适用于由GDI +和WIC(Windows 7)编码器编码的Gif。 下面的代码在Gif的全局图像表中搜索颜色白色的索引,并使用此索引在图形控件扩展块中设置透明颜色。

 byte[] data;

// Save image to byte array
using (MemoryStream target = new MemoryStream(4096))
{
    image.Save(target, imageFormat.Gif);
    data = target.ToArray();
}

// Find the index of the color white in the Global Color Table and set this index as the transparent color
byte packedFields = data[0x0A]; // <packed fields> of the logical screen descriptor
if ((packedFields & 80) != 0 && (packedFields & 0x07) == 0x07) // Global color table is present and has 3 bytes per color
{
    int whiteIndex = -1;
    // Start at last entry of Global Color Table (bigger chance to find white?)
    for (int index = 0x0D + (3 * 255); index > 0x0D; index -= 3)
    {
        if (data[index] == 0xFF && data[index + 1] == 0xFF && data[index + 2] == 0xFF)
        {
            whiteIndex = (int) ((index - 0xD) / 3);
            break;
        }
    }

    if (whiteIndex != -1)
    {
        // Set transparency
        // Check Graphic Control Extension signature (0x21 0xF9)
        if (data[0x30D] == 0x21 && data[0x30E] == 0xF9)
            data[0x313] = (byte)whiteIndex;
    }
}

// Now the byte array contains a Gif image with white as the transparent color

答案 1 :(得分:0)

您确定这是一个Windows 7问题,并且在您的代码的其他地方没有问题吗?

GIF specification表明任何索引都可用于透明度。您可能需要检查图像以确保设置适当的位启用透明度。如果不是,那么您选择的调色板索引将被忽略。