C# 比较两个位图图像以检查它们在WPF中是否不同的最快方法

C# 比较两个位图图像以检查它们在WPF中是否不同的最快方法,c#,wpf,image,bitmap,C#,Wpf,Image,Bitmap,比较2个BitmapImage对象的最快方法是什么。一个在Image Source属性中,另一个在代码中创建 我可以用新的位图图像设置图像源,但它会导致闪烁,因为它会反复设置相同的图像 我只想在图像像素与image.Source中的像素不同时设置图像 编辑: AlbumArt是视图中的图像(在MVVM之后) 某些代码(在“代码隐藏”视图中运行): 您可以比较位图图像的字节数,以检查它们是否相等 比如: public static class BitmapImageExtensions {

比较2个BitmapImage对象的最快方法是什么。一个在Image Source属性中,另一个在代码中创建

我可以用新的位图图像设置图像源,但它会导致闪烁,因为它会反复设置相同的图像

我只想在图像像素与image.Source中的像素不同时设置图像

编辑:

AlbumArt是视图中的图像(在MVVM之后)

某些代码(在“代码隐藏”视图中运行):


您可以比较
位图图像的字节数
,以检查它们是否相等

比如:

public static class BitmapImageExtensions
{
    public static bool IsEqual(this BitmapImage image1, BitmapImage image2)
    {
        if (image1 == null || image2 == null)
        {
            return false;
        }
        return image1.ToBytes().SequenceEqual(image2.ToBytes());
    }

    public static byte[] ToBytes(this BitmapImage image)
    {
        byte[] data = new byte[] { };
        if (image != null)
        {
            try
            {
                var encoder = new BmpBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(image));
                using (MemoryStream ms = new MemoryStream())
                {
                    encoder.Save(ms);
                    data = ms.ToArray();
                }
                return data;
            }
            catch (Exception ex)
            {
            }
        }
        return data;
    }
}
用法:

BitmapImage image1 = ..............
BitmapImage image2 = ................

if (image1.IsEqual(image2))
{
    // same image
}

图像有多大?一般来说,我认为没有一种快速的方法可以对图像进行像素级的比较。您最好使用某种sentinel值,仅在图像生成器的输入发生更改时才更改图像。您到底在做什么?你可以发布一些代码。如果你只是简单地用另一幅完全相同的位图替换一幅图像的源位图,应该不会有任何闪烁;WriteableBitmapExI添加了一些代码,因此您可以看到我正在使用当前设备每秒提供给我的任何唱片集艺术字符串设置图像。我把这个字符串变成URI,从中得到一个位图图像。我看到它总是在设置相同的图像时闪烁。Meirion,我查了一下,虽然它看起来会起作用,但我们正在避免使用开源库。不过,我很感激。杰森,问得好。图像非常小,320 x 320;sa_ddam213下面的答案对性能影响很小。这是我一直在思考的,一种与像素或字节进行比较的方法,谢谢,我会试试这个。非常感谢。这正是我想要的。:)
BitmapImage image1 = ..............
BitmapImage image2 = ................

if (image1.IsEqual(image2))
{
    // same image
}