【问题标题】:How to display Grayscale image after changing the indexing in C#如何在 C# 中更改索引后显示灰度图像
【发布时间】:2015-05-07 14:03:40
【问题描述】:

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

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 对象引发了异常 - “无法从具有索引像素格式的图像创建图形对象”。所以我将位图更改为 Format24bppRGB。现在,也不例外。但是在我在图像上绘制框并尝试保存后,图像全黑。这是因为在“灰度”图像的情况下,R=G=B。这在使其非索引后丢失。我将位图更改为再次被索引(Format8bbIndexed)。更改调色板,但没有任何帮助。我仍然得到图像是完全黑色的。请帮忙。我的新代码如下-

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;
}

【问题讨论】:

  • 对不起,我可能遗漏了一些东西,但似乎 tmp2 已创建但从未填充原始位图。实际上,您可以在内存中保存完全黑色的矩形。
  • 谢谢一百万。不知道我是怎么错过的。
  • 我会添加这样的答案。

标签: c# image bitmapimage


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试在你需要的 BPP 和大小中创建一个新的位图,然后绘制图像,然后绘制矩形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多