【问题标题】:Picturebox, set and get property to take an image throwing null C#Picturebox,设置和获取属性以获取图像抛出空 C#
【发布时间】:2020-08-03 08:59:39
【问题描述】:

我有一个图片框,之后会被OpenFileDialog() 填满,我必须从中渲染直方图(图表)。我使用getset 属性将图像从图片框获取到另一个类或表单。但我总是得到 NullReferenceException。打开图像文件后,位图似乎没有图像,所以它什么也没返回。我尝试用图像的完整路径填充位图参数并且它正在工作,但OpenFileDialog() 变得毫无意义。

  1. 点击选项按钮:

  2. 渲染直方图:

这是我的代码


MainForm.cs

// button for opening image
private void openImage_Click(object sender, EventArgs e)
    {
        OpenFileDialog img = new OpenFileDialog();
        img.Title = "Open Image File...";
        img.Filter = "Image File (*.bmp, *.jpg, *.jpeg, *.png |*.bmp;*.jpg; *.jpeg;*.png";

        if (img.ShowDialog() == DialogResult.OK) {
            pbInput.Image = new Bitmap(img.FileName);
            // blablabla
        }
    }

    // set and get property
    public Image getImage {
        get { return pbInput.Image; }
        set { pbInput.Image = value; }
    }

OptionsForm.cs

    private void hist1_Click(object sender, EventArgs e)
    {
        h1 = new Histogram();
        h1.FormClosed += (s, a) => hist1.Enabled = true;
        hist1.Enabled = false;
        h1.Show();

    }

Histogram.cs

public partial class Histogram : Form
{
    MainForm m = new MainForm();

    public Histogram()
    {
        InitializeComponent();

        Bitmap b = new Bitmap(m.getImage);

        //bla bla bla. . . . . *creating histogram code
    }
 }

我得到的错误信息:

我希望这个问题足够清楚。谢谢..! PS:英语不是我的主要语言,请为我的语法等道歉。

【问题讨论】:

    标签: c# forms class properties picturebox


    【解决方案1】:

    当您在Histogram.cs 中写入MainForm m = new MainForm(); 时,

    您创建了一个全新的 Form 对象,它没有引用旧表单的图像

    您想要的是能够在新表单中访问旧表单的对象引用,或者更好地在 Histogram.cs 中获取该 image3 引用

    一种方法是将其传递给构造函数

    直方图按钮

    private void hist1_Click(object sender, EventArgs e)
    {
        h1 = new Histogram(this.getImage);
        h1.FormClosed += (s, a) => hist1.Enabled = true;
        hist1.Enabled = false;
        h1.Show();
    }
    

    然后是你的直方图表格

    public partial class Histogram : Form
    {
        public Histogram(Image image)
        {
            Bitmap b = new Bitmap(image);
        }
    }
    

    这将为您提供直方图形式的图像。

    【讨论】:

    • 哦,忘了说。 hist1_Click 位于 OptionForm.cs。那我就不能执行了,你在说什么(?)
    • 那么您必须将 Image 从 MainForm 传递给 OptionForm(与我在示例中所做的相同),保留其引用,然后将其传递给 Histogram。
    【解决方案2】:

    您应该将图像设置为图像属性 getImage = new Bitmap(img.FileName);

    【讨论】:

      【解决方案3】:

      您为什么不直接将图像分配给您的属性?

      public Image getImage { get; private set; } // Auto-implemented property.
      

      喜欢这个

      if (img.ShowDialog() == DialogResult.OK) {
          getImage = new Bitmap(img.FileName);
          pbInput.Image = getImage;
      }
      

      顺便说一句,getImage 不是一个好名字。 GetSomething 一般用于方法。只需致电您的物业Image

      public Image Image { get; private set; }
      

      【讨论】:

      • 我认为@MihirDave 找到了问题的原因。您正在使用 MainForm m = new MainForm(); 在 Histogram.cs 中创建一个新表单。这个MainForm 表单的新实例不包含您在原始表单中所做的条目。将位图作为构造函数参数添加到选项和直方图表单中。然后在打开表单时传递此图像:new OptionsForm(getImage); 与直方图形式相同。
      猜你喜欢
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      • 2014-07-24
      • 1970-01-01
      相关资源
      最近更新 更多