C# 在 PictureBox 中显示 8BPP 索引位图会导致颜色问题

问题描述 投票:0回答:1

我在 ImageBox 中显示 8bpp 索引 OpenCV Mat 时遇到问题, 图像尺寸很大,我试图避免逐像素复制

图像转换和显示的代码如下 但图像显示为彩色而不是灰度,并且颜色不正确。我认为它是因为它在位图中使用索引格式而不是灰度格式。但是,System.Drawing.Imaging.PixelFormat中没有灰度选项

不幸的是我无法在这里显示图像, 有没有办法解决在图片框上显示 8bpp 位图的问题,或者我是否需要将像素逐像素复制到每个 RGB 或 RGBA 通道

注意,Mat 本身可以与 ImShow 一起正常工作

    unsafe Bitmap ConvertMatToBitmap(Mat matToConvert)
    {
        Bitmap out_bitmap = null;
        if (matToConvert.Width > 0 && matToConvert.Height > 0)
        {
            fixed (byte* p = matToConvert.GetRawData())
            {
                IntPtr ptr = (IntPtr)p;
                if (matToConvert.NumberOfChannels == 1)
                    out_bitmap = new Bitmap(matToConvert.Width,
                    matToConvert.Height, matToConvert.Width,
                    System.Drawing.Imaging.PixelFormat.Format8bppIndexed,
                    ptr);
            }
        }
        return out_bitmap;
    }

然后

    private void PresentCamera(Bitmap out_data)
    {
        imageBox.SizeMode = PictureBoxSizeMode.StretchImage;
        if (out_data != null)
        {
            imageBox.Image = out_data;
        }
    }
c# winforms opencv bitmap emgucv
1个回答
0
投票

我需要为索引图像定义 1:1 调色板

unsafe Bitmap ConvertMatToBitmap(Mat matToConvert)
{
    Bitmap out_bitmap = null;
    if (matToConvert.Width > 0 && matToConvert.Height > 0)
    {
        fixed (byte* p = matToConvert.GetRawData())
        {
            IntPtr ptr = (IntPtr)p;
            if (matToConvert.NumberOfChannels == 1)
            {
                out_bitmap = new Bitmap(matToConvert.Width,
                matToConvert.Height, matToConvert.Width,
                System.Drawing.Imaging.PixelFormat.Format8bppIndexed,
                ptr);
                    System.Drawing.Imaging.ColorPalette _palette = out_bitmap.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;
                    }
                    out_bitmap.Palette = _palette;
              }
        }
    }
    return out_bitmap;
}
© www.soinside.com 2019 - 2024. All rights reserved.