2

A と B の 2 つのフォームがあります。フォーム A でボタンをクリックすると、フォーム B にある PictureBox に画像が読み込まれます。次の方法で、GrayScale をこの画像に設定します。

   public void SetGrayScale(PictureBox pb)
    {
        ColorMatrix matrix = new ColorMatrix(new float[][]
        {
            new float[] {0.299f, 0.299f, 0.299f, 0, 0},
            new float[] {0.587f, 0.587f, 0.587f, 0, 0},
            new float[] {0.114f, 0.114f, 0.114f, 0, 0},
            new float[] {     0,      0,      0, 1, 0},
            new float[] {     0,      0,      0, 0, 0}
        });

        Image image = (Bitmap)pb.Image.Clone();

        ImageAttributes attributes = new ImageAttributes();
        attributes.SetColorMatrix(matrix);

        Graphics graphics = Graphics.FromImage(image);

        graphics.DrawImage(image,
                            new Rectangle(0, 0, image.Width, image.Height),
                            0,
                            0,
                            image.Width,
                            image.Height,
                            GraphicsUnit.Pixel,
                            attributes);

        graphics.Dispose();

        pb.Image = image;
    }

このコードは、PictureBox が同じフォーム (A) にある場合に正しく機能します。ただし、フォーム B にある場合は、OutOfMemoryException が発生します。なんで ?

4

2 に答える 2

1

私が恐れている実際の答えではなく、あなたが調査するためのより多くの質問/事柄:

  1. あなたの答えへのコメントのように-Imageオブジェクトは正しいですか?

  2. そうでない場合は、このメソッドに渡されたPictureBoxオブジェクトに問題があるか、PictureBoxのImageに正しくアクセスできないことを意味します。

私が最初に考えたのはスレッド化でしたが、どちらのフォームもUIスレッドに含める必要があります。

于 2009-05-29T11:52:43.830 に答える
0

わかりました、修正しました:)解決策は、OpenDialog.FileNameからBitmapオブジェクトを作成し、後でPictureBox.Image = myBitmapを設定する必要があったことです

最初はしていませんでした。PictureBox.Load(OpenDialog.FileName) を設定するだけでした。そして、それは私の間違いでした。

わかりました、ご協力ありがとうございます、ChrisF ! :)

于 2009-05-29T12:30:33.333 に答える