我有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。为什么?
答案 0 :(得分:1)
更多问题/事情让你调查而不是我害怕的实际答案:
正如您对答案的评论一样 - 图像对象是否正确?
如果没有,则表示传入此方法的PictureBox对象出现问题,或者无法正确访问PictureBox的图像。
我的第一个想法是线程化,但两种形式都应该在UI线程中。
答案 1 :(得分:0)
好的,我已经修好了:) 解决方法是,我必须从OpenDialog.FileName创建一个Bitmap对象,然后设置PictureBox.Image = myBitmap
我一开始没有这样做,我只是设置了PictureBox.Load(OpenDialog.FileName)。这是我的错误。
好的,谢谢你的合作,ChrisF! :)