【问题标题】:Two different method outputs the same image两种不同的方法输出相同的图像
【发布时间】: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.ImgpictureBoxNoisyImg.Image(它们指向同一个图像)持有,一个在 pBox_PROCESSED.Image。这些都占用内存。当您不再需要其中一张图片时,请记住Dispose() 。你总是可以在分配一个新的之前写f1.Img?.Dispose();之类的东西,所以即使f1.Imgnull它也不会抛出异常。

标签: c# class image-processing properties


【解决方案1】:

在 c# 中,位图作为参考操作。

因此,您复制位图。

pictureBox.Image = bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                   System.Drawing.Imaging.PixelFormat.DontCare);

此外,必须调用它以防止内存泄漏。

if (pictureBox.Image != null)
{
    pictureBox.Image.Dispose();
}

【讨论】:

  • 谢谢我会添加内存泄漏部分。但我不明白为什么我的代码不能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2016-11-12
  • 2016-03-15
  • 2021-01-25
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多