2012-01-11 8 views
1

モバイルアプリケーションでは、24ビットのビットマップから1ビットのビットマップを生成する必要があります。問題は、結果が正しくないことなので、私はこの小さなプロジェクトをデスクトップPCで試してみました。創造はうまくいくが、あなたが見るように結果は大丈夫ではない。24ビットから1ビットのビットマップへの変換

多くのビットが適切な位置になく、いくつかのピクセルが左または右に移動するため、ほとんど読み取ることができません。

これは私が作成に使用するコードである:

int z = 0; 
int bitNumber = 0; 
//the new 1Bit-byte-Array 
byte[] oneBitImage = new byte[(bmp.Height * bmp.Width)/8]; 

BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
unsafe 
{ 
    byte* p = (byte*)(void*)bmData.Scan0.ToPointer(); 
    int stopAddress = (int)p + bmp.Height * bmData.Stride; 
    while ((int)p != stopAddress) 
    { 
    if (*p < 128) // is black 
    oneBitImage[z] = (byte)(oneBitImage[z] | Exp(bitNumber)); //Set a Bit on the specified position 
    p += 3; 

    bitNumber++; 

    if (bitNumber == 8) 
    { 
     bitNumber = 0; 
     z++; 
    } 
    } 
} 

bmp.UnlockBits(bmData); 

//Convert into 1-bit-bmp to check result 
Bitmap newbmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format1bppIndexed); 

BitmapData bmpData = newbmp.LockBits(
          new Rectangle(0, 0, newbmp.Width, newbmp.Height), 
          ImageLockMode.WriteOnly, newbmp.PixelFormat); 

Marshal.Copy(oneBitImage, 0, bmpData.Scan0, oneBitImage.Length); 

newbmp.UnlockBits(bmpData); 

newbmp.Save(fileName, ImageFormat.Bmp); 

簡単な説明: 私はすべての3バイト目に通し、そしてこのバイトなら - 24における3バイトのグループの最初のものは、(ピクセル-bit) - 128より小さい指定された位置にビットを置く。 EXPは私に指数を与えます...

答えて

2

出力バイトごとにビットを切り替えます。ビット7はビット0などである必要があります。

+0

ありがとう、あなたは素晴らしいです - 私はこのf **の間違いを数時間見ましたが、すべてを試しましたが、私はこれを理解するために愚かでした。あなたは私に言いました...私はあなたに1つ借りています - 敬具Karl – Karl

+0

OK。しかし、AlexSもそうです。青のチャンネルの価値を取るだけでなく、他のチャンネルも考慮に入れてください。 –

+0

はい、私は24ビットイメージを自分自身で作成します。これは白黒だけですので、他のものもチェックする必要はありません。さらに2つの比較を行います... – Karl

1

3バイトを「実」色(長い値など)に変換し、その結果が16.7mの半分より大きいかどうかを確認します。

+0

私は一部同意します。これは画像がシフトされる理由ではありませんが、1 bpp画像に変換するときは、3色のバイトすべてを考慮に入れています。色のオクテットのいずれかがFFよりも00に近い場合、ピクセルが黒であると考える傾向があります。しかし、これもピクセルシフトの問題ではありません。 – tcarvin

+0

あなたはそうです。シフトされたビットの問題について私は十分に考えなかった。 3バイトを色に変換することは私の最初の考えでした – AlexS

関連する問題