2

我有 2 个表单,A 和 B。在表单 A 上,我单击一个按钮,并且正在将图像加载到位于表单 B 上的 PictureBox。并且,我想通过以下方式将灰度设置为此图像:

   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) 上时,此代码可以正常工作。但是,当它在 Form 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 回答