ビットマップ画像があるとします。画像内のすべての個々のバイトを反復処理することは可能ですか? はいの場合、どのように?
4226 次
4 に答える
6
私はこれを見つけました: http://channel9.msdn.com/forums/TechOff/108813-Bitmap-to-byte-array/
Memorystream と .Save メソッドを使用できると言うと、次のようになります。
System.Drawing.Bitmap bmp = GetTheBitmap();
System.IO.MemoryStream stream = new System.IO.MemoryStream();
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
stream.Position = 0;
byte[] data = new byte[stream.Length];
stream.Read(data, 0, stream.Length);
于 2008-12-03T16:03:05.663 に答える
5
ピクセル情報にアクセスする必要がある場合、非常に低速ですが非常に簡単な方法は、ビットマップオブジェクトでGetPixelメソッドとSetPixelメソッドを呼び出すことです。
超高速でそれほど難しくない方法は、ビットマップのLockBitsメソッドを呼び出し、そこから返されたBitmapDataオブジェクトを使用して、ビットマップのバイトデータを直接読み書きすることです。この後半の部分は、Ilyaの例のようにマーシャルクラスで実行できます。または、次のようにマーシャルのオーバーヘッドをスキップできます。
BitmapData data;
int x = 0; //or whatever
int y = 0;
unsafe
{
byte* row = (byte*)data.Scan0 + (y * data.Stride);
int columnOffset = x * 4;
byte B = row[columnOffset];
byte G = row[columnOffset + 1];
byte R = row[columnOffset + 2];
byte A = row[columnOffset + 3];
}
于 2008-12-03T16:51:23.397 に答える
4
Bitmap クラスの LockBits メンバを使用して BitmapData を取得し、Scan0 と Marshal.ReadByte を使用して readbytes を実行します。以下に小さな例を示します (ただし、正しい明るさの調整に関するものではありません)。
public static void AdjustBrightness(Bitmap image, int brightness)
{
int offset = 0;
brightness = (brightness * 255) / 100;
// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
IntPtr Scan0 = bmData.Scan0;
int nVal = 0;
int nOffset = stride - image.Width * 3;
int nWidth = image.Width * 3;
for (int y = 0; y < image.Height; ++y)
{
for (int x = 0; x < nWidth; ++x)
{
nVal = Marshal.ReadByte(Scan0, offset) + brightness;
if (nVal < 0)
nVal = 0;
if (nVal > 255)
nVal = 255;
Marshal.WriteByte(Scan0, offset, (byte)nVal);
++offset;
}
offset += nOffset;
}
image.UnlockBits(bmData);
}
于 2008-12-03T16:08:26.430 に答える