2016-02-19 54 views
-2

像素按順序存儲在PNG中(2種變體 - 原始和亞當交錯)。有RFC 2083,它描述了這些佈局變體。我想了解如何將流中的像素位置轉換爲位圖中的位置。如何使用pngcs中的像素填充位圖對象?

存在一些障礙 - 序列號取決於圖像的尺寸(在隔行掃描模式下,某些像素可能會跳過,因爲它們超出了範圍)。

如何清楚地實現這一點,或者做好現成的實施?

+1

你想做什麼?如果你想直接讀取一個PNG文件,它不是像素數據,它是壓縮和編碼的,經過解壓縮和解碼後,你將獲得像素數據,所有這些都可以自動完成,只需使用Image.FromFile ... – Gusman

+0

https://github.com/leonbloy/pngcs/issues/12 – user1709408

+1

你在搞混合事情,你在幫助中指出的類沒有像讀png,它需要一個*已經加載* PNG並操縱它。再次,閱讀PNG並不只是讀取像素數據,它是LZH壓縮和RLE編碼,更好地採取一個託管的預製課程,而不是自己做,像pngcs,它已經返回像素數據 – Gusman

回答

1

如果您使用的是pngcs,您將會收到一個表示像素數據的整數數組,而不需要關心交織。

然後很容易,看看https://github.com/leonbloy/pngcs/blob/master/SamplesTests/SampleTileImage.cs的例子,每個X整數都是一個像素,X由通道數量定義,所以每個整數都是一個像素的一個分量,這意味着每行有[components * imageWidth]整數。

爲了重建數據然後for循環雙就足夠,這裏爲四個分量的PNG(RGBA)的例子:

int componentSize = 4; 
int lineSize = componentSize * imageWidth; 
int linesOnImage = imageData.Length/lineSize; 

for(int y = 0; y < linesOnImage; y++) 
{ 
    for(int x = 0; x < imageWidth; x++) 
    { 
     int startPixel = y * lineSize + (x * componentSize); 
     Color c = Color.FromArgb(imageData[startPixel + 3], imageData[startPixel], imageData[startPixel + 1], imageData[startPixel + 2]); 
     //Do whatever you need to do with the pixel, you have X and Y coordinates and the color 
    } 
} 

說明用於顏色的第一參數是的最後一個組件作爲Color的像素期望ARGB輸入,而PNG使用RGBA順序。

+0

替換它們https://github.com/leonbloy/pngcs/issues/12#issuecomment-186565845 – user1709408

+0

http://stackoverflow.com/questions/35522932 – user1709408