2017-01-03 13 views
-1

を動作しません。私のコードは動作しますが、バイトは私にとっては奇妙です。私は、実際のバイトではないインデックスを持っていると思います。これが計算して元に戻すと、画像のサイズが大きく(画像サイズが同じでも)色が異なってしまいます。バイトからコピーは、私がMarshall.Copyでバイトをコピーするバイト配列にビットマップからバイトやバックMarshall.Copyと右

Bitmap bmp = new Bitmap(imagepath); 
    Width = bmp.Width; 
    Height = bmp.Height; 
    byte[] data; 
    BitmapData bdata; 
    switch (bmp.PixelFormat) 
    { 
     case PixelFormat.Format8bppIndexed: 
     { 
     data = new byte[Width * Height]; 
     bdata = bmp.LockBits(new Rectangle(0, 0, Width, Height),ImageLockMode.ReadOnly, bmp.PixelFormat); 
     Marshal.Copy(bdata.Scan0, data, 0, data.Length); 
     bmp.UnlockBits(bdata); 
     break; 
     } 
    } 

保存画像:

BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); 
IntPtr pNative = bmData.Scan0; 
Marshal.Copy(data, 0, pNative, Width * Height); 
bmp.UnlockBits(bmData); 
bmp.Save("output.gif",ImageFormat.Gif); //without format, have same problem 

私は最初のピクセルから色を読めば、私が得た:Color [A=0, R=0, G=0, B=2]。これは入力画像の色ですか?

出力は入力から洙異なっている理由私は、知りません。問題はどこですか? (小さな画像申し訳ありません)入力および出力から

例: Input Output

+0

私はImageConverterクラスをバイト配列にビットマップに変換され、それが常にうまく – Sasha

答えて

1

あなたがバイトをリロードするための第二bmpを作成方法を示していませんでした。しかしPixelFormatは、あなたのdata配列がパレットインデックスの代わりに、直接の色情報が含まれていることを意味し、8bbpIndexedです。あなたは二bmpと8ビットのピクセルフォーマットを作成する場合は、元のものとは異なる場合があり、デフォルトのパレットを使用します。

最初の画像のbmp.Paletteを保存し、それを使用して2番目のbmpインスタンスの実際の色を復元する必要があります。

更新:パレットエントリを1つずつ設定することはできますが、効果はありません。代わりにパレット全体を設定する必要があります。また、hereは、インデックス付きのビットマップ操作にポストがあるメソッド(ConvertPixelFormatを参照してください)。

+0

パレットについて覚えておくべき主なものは、パレットオブジェクトのゲッターではなく、内部1を参照の新しいオブジェクトを作成することです。したがって、イメージのパレットの保存されていないコピーを編集するだけなので、 'bmp.Palette.Entries [0] = col'として編集することはできません。 – Nyerguds