2012-02-08 20 views
2

Android用のMono For Android経由で携帯型ブルートゥースプリンタにビットマップを印刷するためのクラスを作成しています。私のクラスはストリームからピクセルデータを取得するために使用されるので、正しい形式でプリンタに送ることができます。今はクラスがシンプルで、高さ、幅、ピクセルあたりのビット数だけを読み込みます。バイト配列のビットマップを垂直方向に反転するアルゴリズム

オフセットを使用して、ピクセルデータを読み取り、プリンタに返します。今は、1ピクセルあたり1ビットの白黒画像で作業しています。私が作業しているビットマップはWindows形式です。

ここで原画像である:

Original Image (Sent as Bitmap)

Result of printing and initial attempt at flip

ここで印刷の結果である、第一の画像は、任意の変換なしです。 2つ目は、次のコードで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]; 
     } 

、私の質問は:

私はバイト配列で働いていたとき、私は垂直方向に画像を反転するにはどうすればよいです。私はこれを行うためのアルゴリズムを見つけるのに苦労している、すべての例は私が使用することができない確立されたグラフィックスライブラリを使用することを示唆しているようだ。行順にwidth*heightビットの形式について

マイビットマップが1次元配列に保存され、最初の行のバイトと、その後、第二、第三、等

+0

あなたは、マトリックス中に画像のピクセルを番号を交換するアルゴを探しているので、画像を回転させますか? – Adrian

+0

@Adrianはい、イメージが正しい向きで印刷されるように配列を変更する必要があります。私は、フォトショップや他のペイントプログラムで "フリップ垂直"コマンドを実行するアルゴリズムを探しています。 – dmck

+0

ビット配列に 'width * height * bits_per_pixel'ビットが含まれるような形式ですか?もしそうなら、 '[first_row | second_row | ...]'の形式で整理されていますか? –

答えて

2

あなたはこのような何かをする必要があります:あなたは二つのループを使用する必要が

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

、ちょうど:

編集ビット配列を2次元配列として表示する必要があります。

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

ピクセルあたり2ビット以上があれば、少し複雑になります。

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

、このコードを使用しますすべての行を繰り返し、2番目の行を繰り返して各行の内側のピクセルを繰り返します。

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]; 
    } 
} 
関連する問題