【问题标题】:Return raw image bits in a BMP file返回 BMP 文件中的原始图像位
【发布时间】:2014-12-05 01:59:48
【问题描述】:

我有 C# dll,我在 Matlab 中使用它来返回存储在 BMP 文件中的原始 8 位灰度位。 (是的,我知道 Matlab 可以读取 BMP,但这是一个测试,适用于数据来自视频帧捕获器的真实系统。

现在,下面的代码正在返回需要剥离的 1078 位标头信息,并且它还在翻转图像的轴(它以镜像形式出现)。解决此问题的最佳方法是什么(最少,性能不是问题)。

image = Image.FromFile(this.imagePath);
ImageConverter converter = new ImageConverter();
data = (byte[])converter.ConvertTo(image, typeof(byte[]));
Frame f = new Frame(data);

public class Frame
{
    public byte[,] frameData = new byte[1024, 1024];

    public Frame(byte[] data)
    {
        Buffer.BlockCopy(data, 0, frameData, 0, 1024 * 1024 * sizeof(byte));
    }
}

【问题讨论】:

  • 您想要C#Matlab 的答案吗?至少对于第二部分(翻转图像),Matlab 可以在一行中完成。
  • 我对这里使用ImageConverter 持怀疑态度。您可以使用其他机制(如LockBits() 方法)直接访问实际的位图数据,无需标题。如果您尝试将 byte[] 传递给 Matlab 并需要帮助,您还需要具体说明您尝试创建的格式。大概是byte[],但还有什么?任何特定的像素格式? Matlab 是否有您需要遵循的特定步幅规则?那种东西。
  • 我希望在 C# 中完成这项工作,而不是 matlab。我只想要一个原始字节数组,以便 Matlab 可以将其作为 uint8 数组读取。 LockBits 看起来让我解决了标题问题。谢谢
  • 但是,我看不到从 BitMapData 到 bytes[] 的方法。

标签: c# .net image matlab


【解决方案1】:

你的意思是这样的:

BitArray bits = new BitArray(returnBytes);
BitArray flippedBits = new BitArray(bits);

for (int i = 0; i < bits.Length; i += width) {
    for (int j = 0, k = width - 1; j < width; ++j, --k) {
        flippedBits[i + j] = bits[i + k];
    }
}

如果您需要倒置镜像,请使用以下代码:

BitArray bits = new BitArray(returnBytes);
BitArray flippedBits = new BitArray(bits);

for (int i = 0, j = bits.Length - width; i < bits.Length; i += width, j -= width) {
    for (int k = 0; k < width; ++k) {
        flippedBits[i + k] = bits[j + k];
    }
}

来源: Algorithm to vertically flip a bitmap in a byte array

【讨论】:

  • 是的,我需要镜子,或者正如你在 matlab A' 中所说的那样(转置)。
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2016-02-27
  • 2019-08-05
  • 2017-07-11
  • 1970-01-01
相关资源
最近更新 更多