2015-05-22 79 views
13

在C#中,我可以聲明新的48bitRGB64bitRGBA沒有問題,實際上正確的格式保存在磁盤上。64位圖像顏色聲明(每通道16位)

但是,當涉及到聲明顏色時,我無法聲明多於8位值的顏色。這似乎是因爲Color聲明期望每個組件不超過8位。

我到目前爲止的代碼:

int x; 
int y; 
int w = 512, h = 512; 

Bitmap image = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format48bppRgb); //New image with 16bit per channel, no problem 

// Double 'for' control structure to go pixel by pixel on the whole image 
for (y = 0; y < h; y++) 
{ 
    for (x = 0; x < w; x++) 
    { 
     comp = somevalue; //Numeric component value 
     // Lo que vaya por aqui 
     System.Drawing.Color newColor = System.Drawing.Color.FromArgb(255, comp, comp, comp); // <= Here is the problem, values can't exceed 256 levels 
     image.SetPixel(x, y, newColor); 
    } 
} 

image.Save(@"C:\test.png", System.Drawing.Imaging.ImageFormat.Png); //Saving image to disk 

什麼是用C#聲明一個16位的顏色成分的方法?

+2

你可以訪問原始像素,在這裏看到如何:http://stackoverflow.com/questions/7768711/setpixel-is-too-slow-is-there-a-faster-way-to-draw-to-位圖 – thumbmunkeys

+1

System.Drawing.Color在內部使用一個long(有符號的64位整數)來表示它的RGBA值,但它的所有操作都接受ints,您需要創建自己的Bitmap類或使用等效的圖形格式庫。 – Machinarius

+0

你使用wpf嗎? – thumbmunkeys

回答

3

該問題源於Bitmap類封裝GDI + bimap的事實。

GDI +版本1.0和1.1可以讀取每通道16位圖像,但是這些圖像會轉換爲每通道8位的格式進行處理,顯示和保存。 link

所以當你設置的像素值是你處理8位每通道格式。

如果使用使用不安全的代碼,則可以直接訪問這些值,請參閱Get 64bpp image color

+1

我試圖避免直接訪問,但似乎沒有更好的方法。非常感謝! –

+0

您可以通過使用'Marshal.Copy'將整個支持數組(或其部分,取決於您的操作)複製到圖像中並在處理後重新使用'Marshal.Copy'來避免不安全的代碼。 – Nyerguds

相關問題