【问题标题】:C# BitmapSource - result is vertically flippedC# BitmapSource - 结果垂直翻转
【发布时间】: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 这样的另一种方法可以为您提供其他扫描线顺序?
  • 相机文档会告诉您您需要知道的一切。像素格式决定了红色、绿色和蓝色通道在像素值中的组织方式,并且您似乎正确(您的图像并不完全是镜像,但颜色足够接近,可以相信像素格式是正确的)。但文档还解释说,它正在向您发送数据,其中最底行的像素作为缓冲区中的第一条扫描线。您可以将数据复制到新的位图对象,反转扫描线,也可以在显示时使用变换来翻转位图

标签: c# wpf format pixel


【解决方案1】:

Peter Duniho 和 Clemens 是对的。 这是解决方案:

int size = buffer.FrameType.BufferSize;
int height = buffer.FrameType.Height;
byte[] img = new byte[size];
int lineSize = buffer.BytesPerLine;
//for each row of the image
for (int row = 0; row < height; row++)
{
     //For each byte on a row
     for (int col = 0; col < lineSize; col++)
     {
           int newIndex = (size - (lineSize * (row + 1))) + col;
           img[newIndex] = buffer[col, row];
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2015-05-17
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多