2013-03-12 34 views
1

我正在與Scintilla(不是ScintillaNET),我試圖設置自動完成列表中使用的圖像。 Scintilla需要RGBA格式的一串字節/像素。RGBA圖像格式(由Scintilla使用)

Scintilla的的這個RGBA格式的描述:Quote from documentation

的RGBA格式允許半透明針對每個 像素的α值。它比XPM更簡單,功能更強大。

該數據是一個4字節的像素值序列,以頂部線的像素 開頭,最左邊的像素在前,然後繼續爲後續行的像素爲 。對於 對齊原因,行之間沒有差距。

每個像素按順序包含一個紅色字節,一個綠色字節,一個藍色字節和一個alpha字節。顏色字節不是由Alpha值預先乘以 。也就是說,全紅像素是25%不透明的將是 [FF,00,00,3F]

我希望我誤解格式如上所述,文檔也不是很清楚。

我的轉換方法:

我寫了這個功能,一個PNG轉換成這串字節:

public static string ConvertFromPNG(Bitmap PNG) 
{ 
    string rgba = ""; 

    int pixWidth = PNG.Width; 
    int pixHeight = PNG.Height; 

    for (var y = 0; y < pixHeight; y++) 
    { 
     for (var x = 0; x < pixWidth; x++) 
     { 
      Color pix = PNG.GetPixel(x, y); 

      rgba += pix.R.ToString("X2") + pix.G.ToString("X2") + pix.B.ToString("X2") + pix.A.ToString("X2"); 
     } 
    } 

    return rgba; 
} 

產生的圖像:

但Scintilla的只是展示作爲灰盒的圖像:

Autocomplete box

有問題的圖片是Microsoft's Babel images之一的副本:Babel icon

我知道字節集是正確的,因爲有趣的是,如果我行格式化和縮小對他們,我能看到圖像的輪廓:

Bytes(Zoomed out in image editor)

字節生成:

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009F000000EC0000001B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815B0000DF9B0000F8000000B40000002F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B0000007F4E0000FDC80000FFFF0000FF720000FF1D0000B50000003E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001613000085350000FFDE0000FFFF0000FFFF0000FFFF0000FF750000FF230000C4000000240000000000000000000000000000000000000000000000000000000000000000000000000000000000000085400000EADB0000FFF90000FFFF0000FFFF0000FFFF0000FFF60000FFA70000F5000000DA00000000000000000000000000000000000000000000000000000000000000000000000000000091810000EACA0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFBB0000FF460000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000FF7E0000FFE80000FFFF0000FFFF0000FFFF0000FFFB0000FFB30000FF460000FF0C0000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000FF660000FFFF0000FFFF0000FFFF0000FFC70000FF0D0000FF590000FF7A0000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000FF8C0000FF7D0000FF2E0000FFFF0000FFBB0000FF1C0000FF510000FFB40000FF7B0000FF000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000FFE20000FFE40000FF410000FF8B0000FF510000FF350000FFB60000FF8F0000FF3A0000EA00000091000000000000000000000000000000000000000000000000000000000000000000000000000000DA910000F5F30000FFFF0000FF0C0000FF270000FFC10000FF930000FF220000EA0000008500000000000000000000000000000000000000000000000000000000000000000000000000000000000000241D0000C4870000FFFF0000FF270000FF420000FF9E0000FF230000FF090000860000001600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003E2D0000B5610000FF120000FF1C0000FF370000FD0000007F0000001B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E000000B4000000F8000000DF00000081000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001B000000EC0000009F0000000000000000000000000000000000000000 

回答

2

您正在將字節格式化爲十六進制值並將它們放入字符串中。 Scintilla只是想要自己的字節。

我懷疑你想要直接創建一個字節數組,而不是字符串,並存儲到它的pix.R值,pix.Gpix.Bpix.A,而不是他們的格式爲字符串。

+0

謝謝,它現在工作。該文件說該方法需要一串字節,這就是我困惑的東西:) – Drahcir 2013-03-12 16:30:53

0

在接受JasonD的回答後,我更新了我的代碼,它正在工作。萬一它幫助其他人,這裏是工作代碼:

public static byte[] ConvertFromPNG(Bitmap PNG) 
{ 
    byte[] rgbaB = new byte[4 * (PNG.Width * PNG.Height)]; 

    int i = 0; 

    for (var y = 0; y < PNG.Height; y++) 
    { 
     for (var x = 0; x < PNG.Width; x++) 
     { 
      Color pix = PNG.GetPixel(x, y); 

      rgbaB[i++] = pix.R; 
      rgbaB[i++] = pix.G; 
      rgbaB[i++] = pix.B; 
      rgbaB[i++] = pix.A; 
     } 
    } 

    return rgbaB; 
}