如何在另一种形式的表单中检查pictureBox的image属性。

时间:2016-02-04 20:18:55

标签: c# winforms user-interface

我创建了一个图像框,可以在单击时更改其中的图像。它以表格A存储。我现在有一个表格b。我想查一下表格b。如果表单A中图片框中的图像等于特定图像,则更改表格B中图片框中的图像。 由于我认为它是私有的,我在访问表格A中的图片框时遇到问题。

3 个答案:

答案 0 :(得分:1)

尽管问题明显简单,但实现这一目标的正确方法看似复杂。您可能需要重新考虑应用程序的体系结构,以另一种方式执行此检查,例如使用关联的ID号或UUID。但是,如果您确实需要以这种方式对图像执行内容相等性检查,则以下是我测试过的基本解决方案。


由于直接比较两个图像以确定它们的相等性对我们来说是非常低效的,因此最好的解决方案是实现一个简单的哈希算法并检查它。这是解决方案中最复杂的部分。为了自动执行此操作并抽象出这一步,我们可以围绕标准Image对象创建一个简单的包装类,如下所示:

public class ComparableImage
{
    public Image Image
    {
        get { return this.image; }
        set { SetImage(value); }
    }
    public string SHA1
    {
        get { return this.sha1; }
    }

    private Image image = null;
    private string sha1 = string.Empty;

    // This is the important part that lets us 
    // efficiently compare two images:
    public override bool Equals(object image)
    {
        if ((image != null) && (image is ComparableImage) )
        {
            return (sha1.Equals(((ComparableImage)image).sha1));
        }
        else return false;
    }

    public override int GetHashCode()
    {
        return sha1.GetHashCode();
    }

    private void SetImage(Image image)
    {
        this.image = image;
        this.sha1 = ComputeSHA1(image);
    }

    private static string ComputeSHA1(Image image)
    {
        if (image != null)
        {
            var bytes = GetBytes(image);
            using (SHA1Managed SHA1 = new SHA1Managed())
            {
                return Convert.ToBase64String(SHA1.ComputeHash(bytes));
            }
        }
        else return string.Empty;
    }

    private static byte[] GetBytes(Image image)
    {
        using (var stream = new MemoryStream())
        {
            image.Save(stream, ImageFormat.Bmp);
            return stream.ToArray();
        }
    }
}

使用上面的类,我们可以简单地调用Equals方法来确定两个图像在内容上是否相等,而不必担心除了创建ComparableImage个对象之外的任何其他内容。


下一个问题是从每个表单中公开一个公共Image属性,这使我们能够访问ComparableImage的实例。我们可以使用以下模式轻松完成此任务:

public class ComparableImageForm : Form
{
    // This is the property we need to expose:
    public ComparableImage Image
    {
        get { return this.image; }
        set { SetImage(value); }
    }

    private ComparableImage image;

    private PictureBox pictureBox = new PictureBox()
    {
        Dock = DockStyle.Fill
    };

    public ComparableImageForm()
    {
        this.Controls.Add(pictureBox);
    }

    // For clarity, we are also setting a picture box image
    // from the ComparableImage when it is assigned:
    private void SetImage(ComparableImage image)
    {
        this.image = image;
        pictureBox.Image = image.Image;
    }
}

最后,我们准备加载一些图像进行一些测试比较:

// Load two images from file to compare.
// In practice, images can be loaded from anywhere,
// even from the designer.
var image1 = new ComparableImage()
{
    Image = Image.FromFile("bitmap1.bmp")
};
var image2 = new ComparableImage()
{
    Image = Image.FromFile("bitmap2.bmp")
};


// Create two forms that have picture boxes:            
var formA = new ComparableImageForm()
{
    Image = image1
};
var formB = new ComparableImageForm()
{
    Image = image2
};

// Perform the check to see if they are equal:
if (formA.Image.Equals(formB.Image))
{
    MessageBox.Show("The images are indeed equal.");
}
else
{
    MessageBox.Show("The images are NOT equal.");
}


// Since images are compared based on their SHA1 hash, 
// it does not matter where the image comes from as long
// as the data is the same.  Here, we are loading another
// copy of 'bitmap1.bmp':
var anotherImage = new ComparableImage()
{
    Image = Image.FromFile("bitmap1.bmp")
};

// The following statement will evaluate as true:
bool isEqual = (anotherImage.Equals(image1));


多数民众赞成!

答案 1 :(得分:0)

您应该从表单中创建一个实例B.搜索该表单的控件,查找图片框并更改其属性。并在每次要显示该表单时显示该实例。

答案 2 :(得分:0)

比较图像以检测它们是否相同并不是一个好主意。

最好为每张图片提供一个唯一的ID并将其存储在变量中。确保两个表单都可以访问该变量,因此您可以将其与form2中的图像ID进行比较。