3

このコードを実行したい

        Bitmap grayImage = (Bitmap)img.Clone();

        for (int x = 0; x < arr.GetLength(0); x++)
        {
            for (int y = 0; y < arr.GetLength(1); y++)
            {
                int col = arr[x, y];
                Color grau = Color.FromArgb(col, col, col);
                grayImage.SetPixel(x, y, grau);
            }
        }

コードを実行すると、次の行で例外が発生します: grayImage.SetPixel(x, y, grau);

例外の詳細は次のとおりです。

System.Runtime.InteropServices.ExternalException は、ほとんどの場合例外です。Message="GDI+ で一般的なエラーが発生しました。" Source="System.Drawing" ErrorCode=-2147467259 StackTrace: System.Drawing.Bitmap.SetPixel(Int32 x, Int32 y, Color color) at Metalldetektor.Bild.ArrToPic(Int32[,] arr, Image img) in D: \Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Bild.cs:D:\Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1 の Metalldetektor.Form1.button2_Click(オブジェクト送信者、EventArgs e) の 44 行目。 cs:58行目 System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button,

どうすればいいのかわからないので助けてください!

4

4 に答える 4

2

過去に同様の問題が発生し、複製されたビットマップにいくつかのアーティファクトがありました。この問題をしばらく調査した後、私は助けになったこのスレッドに出くわしました。

Clone()を置き換えてみてください

Bitmap grayImage = (Bitmap)img.Clone();

これとともに:

Bitmap grayImage = new Bitmap(img);
于 2009-05-16T11:30:34.260 に答える
0

ずっと前に、私のチームメートのシステムの1つでイメージを処理する(SQLサーバーからバイナリデータを読み取ることによってイメージを作成する)ときにエラーが発生しました。同じコードが他のマシンでも正常に機能しました。彼はグラフィックドライバのアップデートをインストールしていて、それが問題を引き起こしたことが判明しました。

于 2009-05-16T11:27:59.993 に答える
0

すべて(または左上の長方形)を上書きするだけの場合、なぜ別の画像のクローンを作成するのですか?

于 2009-05-16T11:29:50.113 に答える
0

バグについてはわかりませんが、これは LockBits の場合かもしれません...例を作成できるかどうかを確認します。

データの配列を ARGB ビットマップに書き込む簡単な例を次に示します。

    // fake data
    int[,] data = new int[100, 150];
    int width = data.GetLength(0), height= data.GetLength(1);
    for (int x = 0; x < width; x++)
        for (int y = 0; y < height; y++)
            data[x, y] = x + y;

    // process it into a Bitmap
    Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
    BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height),
       ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
    unsafe {
        byte* root = (byte*)bd.Scan0;
        for (int y = 0; y < height; y++) {
            byte* pixel = root;
            for (int x = 0; x < width; x++) {
                byte col = (byte)data[x, y];
                pixel[0] = col;
                pixel[1] = col;
                pixel[2] = col;
                pixel[3] = 255;
                pixel += 4;
            }
            root += bd.Stride;
        }
    }
    bmp.UnlockBits(bd);
    bmp.Save("foo.bmp"); // or show on screen, etc

このアプローチは、よりもはるかに高速ですSetPixel

于 2009-05-16T11:17:36.757 に答える