3

ビットマップ画像があるとします。画像内のすべての個々のバイトを反復処理することは可能ですか? はいの場合、どのように?

4

4 に答える 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 に答える