2009-11-25 2 views
1

До Windows 7 (и новых кодеков изображений: WIC) я использовал метод следующий (очень быстрый, но грязный) для создания кодированного изображения Gif с белым, как прозрачный цвет:.NET Framework и прозрачность 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-кодер динамически генерирует палитру на основе используемых цветов?

Мой вопрос: У кого-нибудь есть понимание нового Gif-кодировщика Windows 7 и что было бы хорошим и быстрым способом сделать цвет белым прозрачным?

ответ

3

Я нашел лучший способ установить цвет белый как прозрачный цвет для gif-кодированного изображения. Кажется, что это работает для Gif, которые кодируются кодами GDI + и WIC (Windows 7). Следующий код выполняет поиск индекса белого цвета в Глобальной таблице изображений 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 
0

Вы уверены, что это проблема с Windows 7 и не проблема в другом месте с кодом?

GIF specification предполагает, что любой показатель может использоваться для прозрачности. Вы можете проверить свое изображение, чтобы убедиться в том, что установлен соответствующий прозрачный бит. Если это не так, то выбранный вами индекс палитры будет проигнорирован.

+0

Спасибо за ваш ответ. На самом деле ничего не происходит с кодировщиком Windows 7 Gif. Только, он ведет себя по-другому по сравнению с предыдущим кодировщиком: он создает другую (но правильную) палитру. Поскольку эта палитра изменилась, мой код больше не работает. Мне интересно, есть ли быстрый способ определить, что индекс имеет белый цвет в палитре, поэтому я могу установить этот индекс как прозрачный. – Corne

Смежные вопросы