【发布时间】:2015-04-07 01:03:03
【问题描述】:
我正在用 C#/WPF 实现一个软件,该软件正在从相机记录图像。 结果是一个位图,我将其复制到一个字节[]。
pixelFormat = System.Windows.Media.PixelFormats.Bgr24;
int size = buffer.FrameType.BufferSize;
byte[] img = new byte[size];
Marshal.Copy(buffer.GetImageDataPtr(), img, 0, size);
我正在使用这个 byte[] 创建一个 BitmapSource,但我得到的结果是垂直翻转的。
int stride = width * (pixelFormat.BitsPerPixel / 8);
image = BitmapSource.Create(width,
height,
96,
96,
pixelFormat,
BitmapPalettes.Gray256Transparent,
img,
stride);
在我看来,可能有问题的一点是 PixelFormat。相机使用的是 system.drawing.imaging.pixelformat,而我使用的是 System.Windows.Media.pixelformat。 相机使用的是 RGB24,但文档说它“对 RGB24 像素格式使用 BGR 顺序。图像缓冲区中像素的组织是从左到右,自下而上。”
可能是什么问题?我是否使用了错误的像素格式?
【问题讨论】:
-
像素格式不是问题,否则您将看不到正确的颜色。这只是原始缓冲区中扫描线的顺序。 WPF BitmapSource 是自上而下创建的,而缓冲区显然包含自下而上顺序的扫描线。是否有像
GetImageDataPtr这样的另一种方法可以为您提供其他扫描线顺序? -
相机文档会告诉您您需要知道的一切。像素格式决定了红色、绿色和蓝色通道在像素值中的组织方式,并且您似乎正确(您的图像并不完全是镜像,但颜色足够接近,可以相信像素格式是正确的)。但文档还解释说,它正在向您发送数据,其中最底行的像素作为缓冲区中的第一条扫描线。您可以将数据复制到新的位图对象,反转扫描线,也可以在显示时使用变换来翻转位图