2011-12-22 91 views
3

下面的代碼被用來創建一個8比特的位圖如何直接定義8位灰度圖像?

Bitmap b = new Bitmap(columns, rows, PixelFormat.Format8bppIndexed); 
BitmapData bmd = b.LockBits(new Rectangle(0, 0, columns, rows), ImageLockMode.ReadWrite, b.PixelFormat); 

但是,當我保存它保存爲一個8位的彩色位圖。是否有可能直接創建一個8位灰度位圖而不創建一個8位彩色位圖,然後不得不將其轉換爲灰度?

+1

如果它的索引那麼它的托盤/查找表定義是否是灰度或不:所以在這裏我們修改我們的位圖文件的調色板。 – 2011-12-22 12:05:08

+0

但是我怎樣才能創建一個8位灰度? – klijo 2011-12-22 12:09:17

+1

如果它是一個索引位圖並且托盤中的所有顏色都是灰度,那麼它是灰度位圖嗎? (我不知道,但如果答案是肯定的,那麼我的評論就是正確的)。 – 2011-12-22 12:10:25

回答

1

如果你有一個調色板的位圖,那麼bmp是否是灰度的概念並不是真的。只要調色板中的所有顏色都是灰度,那麼bmp就是。

此代碼應有助於(它的VB,但應該很容易翻譯):

Private Function GetGrayScalePalette() As ColorPalette 
    Dim bmp As Bitmap = New Bitmap(1, 1, Imaging.PixelFormat.Format8bppIndexed) 

    Dim monoPalette As ColorPalette = bmp.Palette 

    Dim entries() As Color = monoPalette.Entries 

    Dim i As Integer 
    For i = 0 To 256 - 1 Step i + 1 
     entries(i) = Color.FromArgb(i, i, i) 
    Next 

    Return monoPalette 
End Function 

這裏找到:http://social.msdn.microsoft.com/Forums/en-us/vblanguage/thread/500f7827-06cf-4646-a4a1-e075c16bbb38

+0

很好,從那個線程我讀,沒有8位灰度位圖格式的東西。它的調色板需要灰度。它是否正確 ? – klijo 2011-12-22 13:01:16

+1

這就是搜索谷歌似乎表明。 – 2011-12-22 13:02:10

+0

OP要求C#代碼,您的解決方案是在VB中。 – Boggartfly 2016-11-12 02:41:52

5

我只是遇到了這個問題,並解決它,這幫助下:enter link description here

但我會把我的快速解決方案放在這裏,希望它能幫助你。 :) 位圖文件包含四個部分,一個是調色板,它決定如何顯示顏色。當然

myBMP = new Bitmap(_xSize, _ySize, _xSize, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, _pImage); 
    //_pImage is the pointer for our image 
    //Change palatte of 8bit indexed BITMAP. Make r(i)=g(i)=b(i) 
    ColorPalette _palette = myBMP.Palette; 
    Color[] _entries = _palette.Entries; 
    for (int i = 0; i < 256; i++) 
    { 
     Color b = new Color(); 
     b = Color.FromArgb((byte)i, (byte)i, (byte)i); 
     _entries[i] = b; 
    } 
    myBMP.Palette = _palette; 
    return myBMP; 
+0

比將數據寫入8位圖像的指針更安全的方法是將數據存入數組[使用LockBits和Marshal.Copy複製](https://stackoverflow.com/a /395685分之43967594)。 – Nyerguds 2018-02-03 13:50:48