2011-12-19 71 views
3

我有一個8位位圖彩色圖像。當我做了C#打印像素值

Color pixelcolor = b.GetPixel(j,i);  
Console.Write(pixelcolor.ToString() + " "); 

我得到

Color [A=255, R=255, G=255, B=255] 

我需要只有8位值。 R,G,B,A不是24位分離值。

+0

是像8位索引或非索引? – 2011-12-19 08:51:15

+0

@ErnodeWeerd我老實說從未遇到過非索引8bpp格式。這意味着每個顏色分量只有2或3位,這對於存儲有意義的顏色信息來說太小了。 – Nyerguds 2018-01-10 08:36:28

+0

@Nyerguds - 沒有遇到它並不意味着根據規格是不可能的。單色或四色圖像根本不是那麼遙遠。 – 2018-01-10 11:07:56

回答

4

直接使用Bitmap類沒有辦法做到這一點。在項目第一Remeber到enable unsafe code:但是,您可以使用LockBits方法直接使用unsafe代碼,這樣訪問像素:

注意

private static unsafe byte GetIndexedPixel(Bitmap b, int x, int y) 
{ 
    if (x < 0 || x >= b.Width) throw new ArgumentOutOfRangeException("x", string.Format("x should be in 0-{0}", b.Width)); 
    if (y < 0 || y >= b.Height) throw new ArgumentOutOfRangeException("y", string.Format("y should be in 0-{0}", b.Height)); 
    var data = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Indexed); 
    try 
    { 
     var scan0 = (byte*) data.Scan0; 
     return scan0[x + y*data.Stride]; 
    } 
    finally 
    { 
     if (data != null) b.UnlockBits(data); 
    } 
} 
+0

您可以通過使用'Marshal.Copy'來避免不安全的字節。 – Nyerguds 2018-01-09 11:56:06

+1

是的,但煩人不得不復制整個緩衝區來查詢一個像素。但是通常大部分(如果不是所有的像素都被讀取),所以在這種情況下,Marshal.Copy是一個很好的選擇。 – vidstige 2018-01-09 15:54:34

+1

是啊...使用此代碼的原因與普通的'GetPixel'有相同的常見問題:在可能有數千甚至上萬個像素的圖像上循環遍歷所有內容時,必須鎖定和解鎖每個像素,是臭名昭着的緩慢,而只是檢查一個字節數組的內容是閃電般的。 – Nyerguds 2018-01-10 08:40:05

-1

你想要的值實際上RGB,分別對應RedGreen和顏色的Blue成分的8位位值。

A是一個Alfa coponent,顏色的透明度值。如果你不關心它,只是不要在字符串輸出中顯示它。

+0

@downvoter:謹慎解釋? – Tigran 2011-12-19 10:00:15

+1

這不是如何索引位圖工作... – vidstige 2016-06-20 06:20:07

1

Bitmap類中的方法不讓您直接獲取調色板索引。

您可以使用Palette屬性獲取圖像的調色板,並在那裏查找顏色,但這是一種解決方法。

要直接獲取調色板索引,您可以使用LockBits方法直接訪問圖像數據。您將不得不使用編組將數據複製到數組中,或者使用不安全模式下的指針來訪問它。


ColorA屬性是阿爾法分量。它可以具有0到255的值,其中0完全透明,255完全固體。

0

如果你不想使用LockBits,你可以這樣做:

/// <summary> 
/// Gets the pixel value in bytes. Uses Bitmap GetPixel method. 
/// </summary> 
/// <param name="bmp">Bitmap</param> 
/// <param name="location">Pixel location</param> 
/// <returns>Pixel value</returns> 
public static byte Get8bppImagePixel(Bitmap bmp, Point location) 
{ 
    Color pixelRGB = bmp.GetPixel(location.X, location.Y); 
    int pixel8bpp = Array.IndexOf(bmp.Palette.Entries, pixelRGB); 
    return (byte)pixel8bpp; 
} 
+0

這是不可靠的,如果調色板有重複。 – Nyerguds 2018-01-09 11:56:41