2014-12-04 62 views
0

我有我在Matlab中使用的C#dll返回存储在BMP文件中的原始8位灰度比特。 (是的,我知道Matlab可以读取BMP,但是这是一个测试,对于数据将来自视频图像采集卡的真实系统)。返回一个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)); 
    } 
} 
+1

待办事项你想在'C#'或'Matlab'中得到答案吗?至少第二部分(翻转图像),Matlab可以在一行中完成。 – Hoki 2014-12-04 17:18:27

+0

我对这里使用'ImageConverter'表示怀疑。您可以使用其他机制(如'LockBits()'方法)直接访问实际位图数据,而不使用标头。如果你想传递一个'byte []'给Matlab并且需要帮助,你还需要明确你想要创建的格式。一个'byte []'可能,但还有什么?任何特定的像素格式? Matlab是否需要遵循特定的步幅规则?之类的东西。 – 2014-12-04 18:22:00

+0

我正在寻找在C#中的工作,而不是matlab。我只是想要一个原始字节数组,以便Matlab可以将其读取为uint8数组。 LockBits看起来像它让我围绕标题问题。谢谢 – 2014-12-08 14:53:33

回答

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

+0

是的,我需要镜子,或者像你在matlab A'(转置)中说的那样。 – 2014-12-08 14:54:17

相关问题