如何检查图像对象是否与资源中的对象相同?
How to check if image object is the same as one from resource?
所以我正在尝试创建一个简单的程序,该程序仅在单击图片框时更改图片。我现在只使用两张图片,所以我的图片框点击事件函数代码
看起来像这样:
private void pictureBox1_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == Labirint.Properties.Resources.first)
pictureBox1.Image = Labirint.Properties.Resources.reitmi;
else if (pictureBox1.Image == Labirint.Properties.Resources.reitmi)
pictureBox1.Image = Labirint.Properties.Resources.first;
}
由于某种原因,if 语句不起作用,图片也没有改变。
我应该怎么办?
注意:原始代码包含错误,第二个 if
撤消第一个 if 条件 的效果将 与 建议的修复一起工作,但添加 else
没有解决问题 - 使用 else
单步执行代码仍然显示没有任何图像匹配。
if (pictureBox1.Image == Labirint.Properties.Resources.first)
pictureBox1.Image = Labirint.Properties.Resources.reitmi;
if (pictureBox1.Image == Labirint.Properties.Resources.reitmi) // was missing else
pictureBox1.Image = Labirint.Properties.Resources.first;
你需要使用else if
,因为如果图像是first
,你将它设置为reitmi
,然后你检查它是否是reitmi
,它现在是,并将其更改回 first
。这最终似乎根本没有改变。
if (pictureBox1.Image == Labirint.Properties.Resources.first)
pictureBox1.Image = Labirint.Properties.Resources.reitmi;
else if (pictureBox1.Image == Labirint.Properties.Resources.reitmi)
pictureBox1.Image = Labirint.Properties.Resources.first;
也许这段代码可能有点大,但对我来说效果很好,试试吧:
这是要求:
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Collections;
这里是要比较的代码:
// Your Images
Image img1 = pictureBox1.Image;
Image img2 = pictureBox2.Image;
// Now set as bitmap
Bitmap bmp1 = new Bitmap(img1);
Bitmap bmp2 = new Bitmap(img2);
// here will be stored the bitmap data
byte[] byt1 = null;
byte[] byt2 = null;
// Get data of bmp1
var bitmapData = bmp1.LockBits(new Rectangle(0, 0, bmp1.Width, bmp1.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp1.PixelFormat);
var length = bitmapData.Stride * bitmapData.Height;
//
byt1 = new byte[length];
//
Marshal.Copy(bitmapData.Scan0, byt1, 0, length);
bmp1.UnlockBits(bitmapData);
// Get data of bmp2
var bitmapData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp2.PixelFormat);
var length2 = bitmapData2.Stride * bitmapData2.Height;
//
byt2 = new byte[length2];
//
Marshal.Copy(bitmapData2.Scan0, byt2, 0, length2);
bmp2.UnlockBits(bitmapData2);
// And now compares these arrays
if (StructuralComparisons.StructuralEqualityComparer.Equals(byt1, byt2))
{
MessageBox.Show("Is Equal");
}
else
{
MessageBox.Show("Isn`t equal");
}
此代码比较每个字节图像以生成结果。可能还有其他更简单的方法。
if (pictureBox1.Image == Labirint.Properties.Resources.first)
这里有一个陷阱,没有足够的 .NET 程序员意识到这一点。负责 很多 的程序,这些程序 运行 内存占用过大。使用 Labirint.Properties.Resources.xxxx 属性 创建一个 new 图像对象,它永远不会匹配任何其他图像。您只需使用 属性 一次,将图像存储在 class 的字段中。大致:
private Image first;
private Image reitmi;
public Form1() {
InitializeComponent();
first = Labirint.Properties.Resources.first;
reitmi = Labirint.Properties.Resources.reitmi;
pictureBox1.Image = first;
}
现在您可以比较它们了:
private void pictureBox1_Click(object sender, EventArgs e) {
if (pictureBox1.Image == first) pictureBox1.Image = reitmi;
else pictureBox1.Image = first;
}
并避免内存膨胀:
private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
first.Dispose();
reitmi.Dispose();
}
所以我正在尝试创建一个简单的程序,该程序仅在单击图片框时更改图片。我现在只使用两张图片,所以我的图片框点击事件函数代码 看起来像这样:
private void pictureBox1_Click(object sender, EventArgs e)
{
if (pictureBox1.Image == Labirint.Properties.Resources.first)
pictureBox1.Image = Labirint.Properties.Resources.reitmi;
else if (pictureBox1.Image == Labirint.Properties.Resources.reitmi)
pictureBox1.Image = Labirint.Properties.Resources.first;
}
由于某种原因,if 语句不起作用,图片也没有改变。 我应该怎么办?
注意:原始代码包含错误,第二个 if
撤消第一个 if 条件 的效果将 与 else
没有解决问题 - 使用 else
单步执行代码仍然显示没有任何图像匹配。
if (pictureBox1.Image == Labirint.Properties.Resources.first)
pictureBox1.Image = Labirint.Properties.Resources.reitmi;
if (pictureBox1.Image == Labirint.Properties.Resources.reitmi) // was missing else
pictureBox1.Image = Labirint.Properties.Resources.first;
你需要使用else if
,因为如果图像是first
,你将它设置为reitmi
,然后你检查它是否是reitmi
,它现在是,并将其更改回 first
。这最终似乎根本没有改变。
if (pictureBox1.Image == Labirint.Properties.Resources.first)
pictureBox1.Image = Labirint.Properties.Resources.reitmi;
else if (pictureBox1.Image == Labirint.Properties.Resources.reitmi)
pictureBox1.Image = Labirint.Properties.Resources.first;
也许这段代码可能有点大,但对我来说效果很好,试试吧:
这是要求:
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Collections;
这里是要比较的代码:
// Your Images
Image img1 = pictureBox1.Image;
Image img2 = pictureBox2.Image;
// Now set as bitmap
Bitmap bmp1 = new Bitmap(img1);
Bitmap bmp2 = new Bitmap(img2);
// here will be stored the bitmap data
byte[] byt1 = null;
byte[] byt2 = null;
// Get data of bmp1
var bitmapData = bmp1.LockBits(new Rectangle(0, 0, bmp1.Width, bmp1.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp1.PixelFormat);
var length = bitmapData.Stride * bitmapData.Height;
//
byt1 = new byte[length];
//
Marshal.Copy(bitmapData.Scan0, byt1, 0, length);
bmp1.UnlockBits(bitmapData);
// Get data of bmp2
var bitmapData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp2.PixelFormat);
var length2 = bitmapData2.Stride * bitmapData2.Height;
//
byt2 = new byte[length2];
//
Marshal.Copy(bitmapData2.Scan0, byt2, 0, length2);
bmp2.UnlockBits(bitmapData2);
// And now compares these arrays
if (StructuralComparisons.StructuralEqualityComparer.Equals(byt1, byt2))
{
MessageBox.Show("Is Equal");
}
else
{
MessageBox.Show("Isn`t equal");
}
此代码比较每个字节图像以生成结果。可能还有其他更简单的方法。
if (pictureBox1.Image == Labirint.Properties.Resources.first)
这里有一个陷阱,没有足够的 .NET 程序员意识到这一点。负责 很多 的程序,这些程序 运行 内存占用过大。使用 Labirint.Properties.Resources.xxxx 属性 创建一个 new 图像对象,它永远不会匹配任何其他图像。您只需使用 属性 一次,将图像存储在 class 的字段中。大致:
private Image first;
private Image reitmi;
public Form1() {
InitializeComponent();
first = Labirint.Properties.Resources.first;
reitmi = Labirint.Properties.Resources.reitmi;
pictureBox1.Image = first;
}
现在您可以比较它们了:
private void pictureBox1_Click(object sender, EventArgs e) {
if (pictureBox1.Image == first) pictureBox1.Image = reitmi;
else pictureBox1.Image = first;
}
并避免内存膨胀:
private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
first.Dispose();
reitmi.Dispose();
}