GrayScale(由ColorMatrix引起)导致OutOfMemoryException。为什么?

时间:2009-05-29 11:30:36

标签: c# grayscale

我有2个表单,A和B.在表单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。为什么?

2 个答案:

答案 0 :(得分:1)

更多问题/事情让你调查而不是我害怕的实际答案:

  1. 正如您对答案的评论一样 - 图像对象是否正确?

  2. 如果没有,则表示传入此方法的PictureBox对象出现问题,或者无法正确访问PictureBox的图像。

  3. 我的第一个想法是线程化,但两种形式都应该在UI线程中。

答案 1 :(得分:0)

好的,我已经修好了:) 解决方法是,我必须从OpenDialog.FileName创建一个Bitmap对象,然后设置PictureBox.Image = myBitmap

我一开始没有这样做,我只是设置了PictureBox.Load(OpenDialog.FileName)。这是我的错误。

好的,谢谢你的合作,ChrisF! :)