2011-01-24 26 views
0

ビットマップをFormat24bppRgbに変換しようとしています。 各ピクセルにカラー配列のセットが必要なので、安全でないコードを使用しました。ビットマップをFormat24bppRgbに変換する

ビットマップが何らかの形でJpegに変換されるという問題があります。 カラー配列を見ると、黒と白の間に奇妙な色(黄色または青色)があります。

色の変化を防ぐ方法はありますか?

//image 
mstr = new MemoryStream(msgSet.VMSPage2Image); 
bitmapFile = new Bitmap(mstr); 
data = bitmapFile.LockBits(new Rectangle(0, 0, bitmapFile.Width, bitmapFile.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
colors = new Color[data.Height, data.Width]; 
unsafe 
{ 
    byte* imgPtr = (byte*)(data.Scan0); 
    for (int i = 0; i < data.Height; i++) 
    { 
     for (int j = 0; j < data.Width; j++) 
     { 
      // write the logic implementation here 

      imgPtr += 1; 
      int G = *imgPtr; 
      imgPtr += 1; 
      int R = *imgPtr; 
      imgPtr += 1; 
      int B = *imgPtr; 
      colors[i, j] = Color.FromArgb(R, G, B); 
     } 
     imgPtr += data.Stride - data.Width * 3; 
    } 
} 
+0

http://stackoverflow.com/questions/2003643/how-is-1-bit-bitmap-data-converted-to-8bit-24bpp –

+3

あなたは説明できます」ビットマップは何らかの形でJpegに変換されます。フレームワークはビットマップしか扱わないので、JPG/PNG/GIF /などを読み込むと、ビットマップにデコードされ、ファイルを再度保存するまでそのままの状態を保ちます。 –

+0

まあ、jpegへのビットマップはちょうど私の推測です..そしてポイントは私が24bppRgbに変換するとき、私はいくつかのピクセルで元の色を失います。 また、bmpファイルをロードしています。 – Devphil

答えて

0

正しく色データを読み取っていますか?私はビットマップが24ビットのビットマップのバイトのレイアウトのためにBGRを使用したと思った。

2

私が最初に見た問題は、逆参照する前にポインタを増分していることです。

次に、次の行へのポインタを正しく進めていません。

最後に、これらのピクセルはGRBではなくBGR順に格納されます。だから、24ビットRGBのための...

for (int y = 0; i < data.Height; i++) 
{ 
    byte* imgPtr = (byte*)(data.Scan0 + (data.Stride * y)); 
    for (int x = 0; j < data.Width; j++) 
    { 
     int b = *imgPtr++; 
     int g = *imgPtr++; 
     int r = *imgPtr++; 
     colors[x, y] = Color.FromArgb(r, g, b); 
    } 
} 
関連する問題