2014-12-04 35 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

相關問題