簡體   English   中英

將位圖轉換為特殊的灰度字節數組

[英]Converting bitmap to special gray scale byte array

我需要在內存中創建一個圖像(可能是巨大的圖像!),並從中提取寬度為x高度的字節數組。 每個字節的值必須為0-255(256個灰度值:白色為0,黑色為255)。 創建圖像的部分很容易,這是我的代碼的一個簡單示例:

img = new Bitmap(width, height);
drawing = Graphics.FromImage(img);
drawing.Clear(Color.Black);// paint the background
drawing.DrawString(text, font, Brushes.White, 0, 0);

問題是將其轉換為“我的”特殊灰度字節數組。 當我使用除Format8bppIndexed之外的任何其他像素格式時,我從位圖獲取的字節數組未達到所需的大小(寬度*長度),因此我需要花費大量時間進行轉換。 當我使用Format8bppIndexed時,我得到的字節數組非常快且大小合適,但是每個字節/像素為0-15。

更改位圖調色板沒有任何影響:

var pal = img.Palette;
for (int i = 1; i < 256; i++){
   pal.Entries[i] = Color.FromArgb(255, 255, 255);
}
img.Palette = pal;

知道怎么做嗎?

編輯:完整代碼:

// assume font can be Times New Roman, size 7500!
static private Bitmap DrawText(String text, Font font)
{
    //first, create a dummy bitmap just to get a graphics object
    var img = new Bitmap(1, 1);
    var drawing = Graphics.FromImage(img);

    //measure the string to see how big the image needs to be
    var textSize = drawing.MeasureString(text, font);

    //free up the dummy image and old graphics object
    img.Dispose();
    drawing.Dispose();

    //create a new image of the right size (must be multiple of 4)
    int width = (int) (textSize.Width/4) * 4;
    int height = (int)(textSize.Height / 4) * 4;
    img = new Bitmap(width, height);

    drawing = Graphics.FromImage(img);

    // paint the background
    drawing.Clear(Color.Black);

    drawing.DrawString(text, font, Brushes.White, 0, 0);

    var bmpData = img.LockBits(new Rectangle(0, 0, img.Width, img.Height),    ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);

    var newBitmap = new Bitmap(width, height, bmpData.Stride, PixelFormat.Format8bppIndexed, bmpData.Scan0);

    drawing.Dispose();

    return newBitmap;
}

private static byte[] GetGrayscleBytesFastest(Bitmap bitmap)
{
    BitmapData bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
    int numbytes = bmpdata.Stride * bitmap.Height;
    byte[] bytedata = new byte[numbytes];
    IntPtr ptr = bmpdata.Scan0;

    Marshal.Copy(ptr, bytedata, 0, numbytes);

    bitmap.UnlockBits(bmpdata);

    return bytedata;
}

您可能需要分兩步執行此操作。 首先,按照將圖像轉換為灰度中所述創建原始圖像的16bpp灰度副本。

然后,使用適當的色表創建8bpp圖像,並將16bpp灰度圖像繪制到該圖像上。 這將為您完成轉換,將16位灰度值轉換為256種不同的顏色。

然后,您應該擁有一個8bpp的圖像,其中包含256種不同的灰色陰影。 然后,您可以調用LockBits來訪問位圖位,這些位圖位將是0到255之間的索引值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM