【发布时间】:2019-07-29 03:03:29
【问题描述】:
我在一个类中创建了两个方法。我的图像的一个属性。我正在尝试为我的图像添加噪点,然后应用我的过滤器。但是当我运行我的代码时,我会在两个 PictureBoxes 上看到我的过滤器结果。嘈杂的图像应该是 PictureBoxes 之一。
注意:如果可能的话,我只想使用一个位图
private void sliderKernel_MouseUp(object sender, MouseEventArgs e)
{
Filtreler f1 = new Filtreler();
f1.Img = new Bitmap(pBox_SOURCE.Image);
int SablonBoyutu = sliderKernel.Value;
f1.addnoise();
pictureBoxNoisyImg.Image = f1.Img;
f1.meanfilter(SablonBoyutu);
pBox_PROCESSED.Image = f1.Img;
}
//MY CLASS FILE
public Bitmap Img { get; set; }
public void addnoise()
{
//i deleted this parts to make easier to read
Img.SetPixel(i, j, Color.FromArgb(randpixelr, randpixelg, randpixelb));
return;
}
public void meanfilter(int kernelsize )
{
//i deleted this parts to make easier to read
Img.SetPixel(x, y, Color.FromArgb(ortalamaR, ortalamaG, ortalamaB));
return;
}
编辑:我更改了 MouseUp 事件。现在,它可以正常工作了。但我不确定,也许也可以做一些改变。
private void sliderKernel_MouseUp(object sender, MouseEventArgs e)
{
Filtreler f1 = new Filtreler();
f1.Img = new Bitmap(pBox_SOURCE.Image);
int SablonBoyutu = sliderKernel.Value;
f1.addnoise();
pictureBoxNoisyImg.Image = f1.Img;
Bitmap MeanImg = (Bitmap)f1.Img.Clone();
f1.meanfilter(SablonBoyutu,MeanImg);
pBox_PROCESSED.Image = MeanImg;
}
【问题讨论】:
-
设置:
f1.Img = new Bitmap(pBox_SOURCE.Image);,您将图像分配给字段。它指向实际的图像内容。当您设置:pictureBoxNoisyImg.Image = f1.Img;时,您通过引用分配图像。参考是Img。对Img的任何更改都会反映在引用它的任何对象中。引用只是一个数字,它允许使用其地址访问存储在内存中的实际对象。图像内容不会被复制。如果您需要对相同的原始图像应用不同的过滤器,请复制图像,最好通过克隆它(请参阅有关它的文档) -
我克隆了原始图像,现在它可以工作了。我是否正确使用了名为 Img 的属性?
-
看起来是这样。请注意,您现在有 3 个位图对象引用:一个是
pBox_SOURCE.Image,第二个由f1.Img和pictureBoxNoisyImg.Image(它们指向同一个图像)持有,一个在pBox_PROCESSED.Image。这些都占用内存。当您不再需要其中一张图片时,请记住Dispose()。你总是可以在分配一个新的之前写f1.Img?.Dispose();之类的东西,所以即使f1.Img是null它也不会抛出异常。
标签: c# class image-processing properties