2009-11-25 3 views
1

는 :.NET 프레임 워크 및 GIF 투명성은 윈도우 7 (그리고 새로운 이미지 코덱 : WIC) 이전

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이 인덱스 255가 흰색 인 표준 팔레트로 Gif를 인코딩하는 데 사용 되었기 때문에이 방법이 효과적이었습니다.

그러나 Windows 7에서는이 방법이 더 이상 작동하지 않습니다. 표준 팔레트가 바뀌었고 인덱스 251이 흰색 인 것으로 보입니다. 그러나 나는 확실하지 않다. 새로운 Gif 인코더가 사용 된 색상을 기반으로 팔레트를 동적으로 생성하고 있습니까?

내 질문 : 누구나 Windows 7의 새로운 Gif 인코더에 대한 통찰력을 갖고 있으며 색을 투명하게 만드는 빠르고 좋은 방법은 무엇입니까?

답변

3

gif로 인코딩 된 이미지의 투명 색상으로 흰색을 설정하는 더 좋은 방법을 찾았습니다. GIF + 및 WIC (Windows 7) 인코더로 인코딩 된 GIF에서 작동하는 것으로 보입니다. 다음 코드는 GIF의 전역 이미지 테이블에서 흰색의 색인을 검색하고이 색인을 사용하여 Graphic Control Extension 블록에서 투명 색상을 설정합니다.

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