2012-02-08 31 views
2

我正在寫一個類,用於通過Mono For Android將位圖打印到Android中的便攜式藍牙打印機。我的類用於從流中獲取像素數據,以便可以以正確的格式將其發送到打印機。現在這個類很簡單,它只是讀取每個像素的高度,寬度和位數。垂直翻轉字節數組中的位圖的算法

使用它讀取的偏移量並將像素數據返回給打印機。現在我正在處理每像素1位黑白圖像。我正在使用的位圖是Windows格式。

這裏是原始圖像:

Original Image (Sent as Bitmap)

Result of printing and initial attempt at flip

這裏是印刷的結果,所述第一圖像是沒有任何轉換。而第二個是用下面的代碼修改BitArray的結果:

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

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

我的問題是:

如何垂直翻轉圖像時,我有一個字節數組工作。我很難找到這樣做的算法,所有的例子似乎都建議使用我不能使用的已建立的圖形庫。

編輯:

我的位圖被保存在一個1個維陣列,與第一行字節,則第二,第三等

+0

您是否正在尋找交換矩陣中的數字,圖像的像素,以便圖像旋轉? 'flip'是什麼意思 – Adrian 2012-02-08 19:20:42

+0

@Adrian是的,我需要修改數組,以便圖像以正確的方向打印。我正在尋找在Photoshop或其他繪畫程序中執行「翻轉垂直」命令的算法。 – dmck 2012-02-08 19:25:24

+0

格式是否使得位數組包含'width * height * bits_per_pixel'位?如果是這樣,它是以「[first_row | second_row | ...]'的形式組織的嗎? – 2012-02-08 19:26:53

回答

2

你需要做這樣的事情:

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]; 
    } 
} 
2

對於格式與行順序width*height位,只需需要將位數組視爲一個二維數組。

for(int row = 0; row < height; ++row) { 
    for(int column = 0; column < width; ++column) { 
     flippedBits[row*width + column] = bits[row*width + (width-1 - column)]; 
    } 
} 

如果每個像素有一個以上的位,會更復雜一點。

1

您需要使用兩個環路,第一個迭代所有行,第二個迭代每行內的像素。

for (int y = 0; y < height; y++) 
{ 
    int row_start = (width/8) * y; 
    int flipped_row = (width/8) * (height-1 - y); 
    for (int x = 0; x < width/8; x++) 
    { 
     flippedBits[flipped_row+x] = bits[row_start+x]; 
    } 
}