Pergunta

Antes do Windows 7 (e dos novos codecs de imagem: WIC), usei o seguinte método (muito rápido, mas sujo) para criar uma imagem codificada por GIF com branco como a cor transparente:

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

Esse método funcionou porque o .NET usado para codificar GIF com uma paleta padrão na qual o índice 255 era o branco da cor.

No Windows 7, no entanto, esse método não está mais funcionando. Parece que a paleta padrão é alterada e agora o índice 251 é a cor branca. No entanto, não tenho certeza. Talvez o novo codificador GIF esteja gerando dinamicamente uma paleta com base nas cores usadas?

Minha pergunta: Alguém tem uma visão do novo codificador GIF do Windows 7 e qual seria uma maneira boa e rápida de tornar a cor branca transparente?

Foi útil?

Solução

Encontrei uma maneira melhor de definir a cor branca como a cor transparente para uma imagem codificada por GIF. Parece funcionar para os GIFs codificados pelos codificadores GDI+ e WIC (Windows 7). O código a seguir procura o índice da cor branca na tabela de imagens globais do GIF e usa esse índice para definir a cor transparente no bloco de extensão de controle gráfico.

 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

Outras dicas

Tem certeza de que este é um problema do Windows 7 e não um problema em outro lugar com seu código?

o Especificação GIF sugere que qualquer índice possa ser usado para transparência. Você pode verificar sua imagem para garantir que a transparência de bits apropriada esteja ativada. Se não for, o índice da paleta que você selecionou será ignorado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top