Как отобразить изображение в градациях серого после изменения индексации в C # - PullRequest
1 голос
/ 02 сентября 2011

У меня есть изображение в градациях серого, которое я извлекаю из БД (оно в байтах).Я хочу нарисовать несколько прямоугольников, используя графический объект, а затем отобразить это изображениеЭто то, что было закодировано ранее -

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).Измените 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 ]

1 голос
/ 02 сентября 2011

Кажется, что tmp2 создан, но никогда не заполнен оригинальным растровым изображением, поэтому вы создаете идеально черный прямоугольник.

0 голосов
/ 02 сентября 2011

Попробуйте создать новое растровое изображение в нужном вам размере и размере, нарисуйте изображение, а затем нарисуйте прямоугольник.

...