0

C# での Lockbits メソッドの使用に関連する質問がありました.1bpp の画像があり、画像のすべてのピクセルにアクセスしようとしていますが、一部はまだ取り残されています。

    public Bitmap Pixels(Bitmap original)
        {
    Rectangle rect = new Rectangle(0, 0, original.Width, original.Height);
                BitmapData bimgData = original.LockBits(rect, ImageLockMode.ReadWrite, original.PixelFormat);

            IntPtr ptr = bimgData.Scan0;

            int bytes = bimgData.Stride * bimg.Height;
            byte[] Values = new byte[bytes];

            Marshal.Copy(ptr, Values, 0, bytes);

            int Val;
            int stride = bimgData.Stride;
for (int column = 0; column < bimgData.Height; column = column + 1)
                    for (int row = 0; row < bimgData.Width; row = row +1)
                    {
                        c = column;
                        r = row;
                        for (int t = 0; t < 8; t++)
                        {
                           Val = Values[((c) * stride) + ((r) / 8)] & 2 ^ t;
                           if (Val == 0)
                                Values[((c) * stride) + ((r) / 8)] = (byte)(Values[((c) * stride) + ((r) / 8)] + 2 ^ t);
                        }
                    }
Marshal.Copy(Values, 0, ptr, bytes);
            original.UnlockBits(bimgData);

            return original;
        }

このコードはすべてのピクセルを白にするはずです

4

1 に答える 1

0
   Val = Values[((c) * stride) + ((r) / 8)] & 2 ^ t;

2 ^ t期待どおりに動作しません。これが Visual Basic の構文です。C# 言語では、^ は XOR 演算子です。代わりに << 演算子を使用し、括弧を使用して演算子の優先順位を処理します。修理:

   Val = Values[((c) * stride) + ((r) / 8)] & (1 << t);

そして、ビットをセットするときに再度修正します。

画像全体を白にするには、この種のコードはまったく必要ないことに注意してください。すべてのバイトを 0xff に設定するだけです。

于 2014-01-29T12:42:25.447 に答える