1

メソッドを使用して画像を操作していますが、タイプのメソッドをlockbit使用して画像を保存した後、ロックビットから取得したバイト配列で操作したデータが操作されていることに気付きました。saveBitmap

たとえば、次のアプローチを想定します。

 Bitmap bmp = new Bitmap(fs);
 BitmapData bits = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
 IntPtr ptr = bits.Scan0;
 int arraySize = Math.Abs(bits.Stride) * bmp.Height;
 Byte[] rgbValues = new Byte[arraySize];
 System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, arraySize);

たとえば、配列内のすべての値を 0 に設定してこれをテストしようとすると、次のようになります。

 for(int x = 0; x < arraySize; x++){
     rgbValues[x] = (Byte) (rgbValues[x] % 2 == 0 ? 0 : 1);
  }
 System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, arraySize);
 bmp.UnlockBits(bits);
 bmp.Save("somewhere");

同じ手法を使用して保存した画像を読み返すと、ロックビットから取得したバイト配列に 10、20、またはその他の奇妙な値が表示されます。

GetPixelより遅い方法を使用する場合、そのような変化に気付かないため、これは通常の動作ではないと思います。

4

0 に答える 0