如何在C#中更改索引后显示灰度图像

时间:2011-09-02 17:04:15

标签: c# image bitmapimage

我有一个灰度图像,我从数据库中提取(它在字节中)。我想在其上使用图形对象绘制一些框,然后显示该图像。这是以前编码的 -

public byte[] DrawOverlayOnGreyscaleImage(byte[] buffer, List<ImagingTransaction.ImagingTransactionField> TransactionFieldList, BLLImageType imageType)
{
    //Load image into a bitmap object via first going into a MemoryStream 
    MemoryStream msBitmap = new MemoryStream(buffer);
    Bitmap BitmapObj = null;
    BitmapObj = new Bitmap(msBitmap);
    int bmwidth = BitmapObj.Width;
    int bmheight = BitmapObj.Height;

    // draw some text on top
    Graphics g = Graphics.FromImage(BitmapObj);

由于现在生成图像的方式发生了变化(Format8bppIndexed),Graphics对象引发了异常 - “无法从具有索引像素格式的图像创建图形对象”。所以我将Bitmap更改为Format24bppRGB。现在,也不例外。但是在我在图像上绘制框并尝试保存它之后,图像全是黑色的。这是因为在“灰度”图像的情况下R = G = B.将其设为非索引后丢失。我将Bitmap更改为Indexed(Format8bbIndexed)。更改ColorPalette,但没有任何帮助。我仍然认为图像是完全黑的。请帮忙。我的新代码如下 -

public byte[] DrawOverlayOnGreyscaleImage(byte[] buffer, List<ImagingTransaction.ImagingTransactionField> TransactionFieldList, BLLImageType imageType)
{

    //Load image into a bitmap object via first going into a MemoryStream 
    MemoryStream msBitmap = new MemoryStream(buffer);
    Bitmap BitmapObj = null;
    BitmapObj = new Bitmap(msBitmap);
    int bmwidth = BitmapObj.Width;
    int bmheight = BitmapObj.Height;

    Bitmap tmp = new Bitmap(BitmapObj.Width, BitmapObj.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

    Graphics g = Graphics.FromImage(tmp);

    Rectangle srcRect;
    int RectWidth;
    int RectHeight;
    Pen myPen = new Pen(System.Drawing.Color.Red, 3);

    foreach (ImagingTransaction.ImagingTransactionField Field in TransactionFieldList)
    {

        // first, do they want to see the rectangles
        if (imageType == BLLImageType.GreyScale_With_FieldRectangles || imageType == BLLImageType.GreyScale_With_FieldRectangles_And_Field_Data)
        {
            RectWidth = Field.LowerRightX - Field.UpperLeftX;
            RectHeight = Field.LowerRightY - Field.UpperLeftY;

            // sanity check for negative values
            if (RectWidth <= 0)
                RectWidth = 10;
            if (RectHeight <= 0)
                RectHeight = 10;

            srcRect = new Rectangle(Field.UpperLeftX, Field.UpperLeftY, RectWidth, RectHeight);
            g.DrawRectangle(myPen, srcRect);
        }
        // now, do they want to see the text to the lower right of the field
        if (imageType == BLLImageType.GreyScale_With_Field_Data || imageType == BLLImageType.GreyScale_With_FieldRectangles_And_Field_Data)
        {
            g.DrawString(Field.FieldValue, new Font("Tahoma", 12), Brushes.Red, new PointF(Field.LowerRightX, Field.LowerRightY)); ;
        }

    }

    MemoryStream msBitmapWithRectangle = new MemoryStream();

    // Save to memory using the Jpeg format
    Bitmap tmp2 = new Bitmap(tmp.Width, tmp.Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
    ColorPalette pal = tmp2.Palette;
    for (int i = 0; i < pal.Entries.Length; i++)
    {
        // create greyscale color table
        pal.Entries[i] = Color.FromArgb(i, i, i);
    }
    tmp2.Palette = pal;
    tmp2.Save(msBitmapWithRectangle, System.Drawing.Imaging.ImageFormat.Jpeg);

    // read to end
    byte[] ByteArrayWithRectangle = msBitmapWithRectangle.GetBuffer();


    // cleanup
    tmp.Dispose();
    tmp2.Dispose();
    BitmapObj.Dispose();
    msBitmap.Close();
    msBitmapWithRectangle.Close();
    return ByteArrayWithRectangle;
}

2 个答案:

答案 0 :(得分:1)

似乎创建了tmp2但从未填充原始位图,因此您创建了一个完美的黑色矩形。

答案 1 :(得分:0)

尝试在BPP中创建一个新的位图,并根据需要调整大小,然后绘制图像,然后绘制矩形。