我在 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;
}
}
我需要为索引图像定义 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;
}