顺序 PrintScreens 比较,生成差异图像?

Sequential PrintScreens Comparison, Generate a difference image?

我正在开发一个定期保存打印屏幕的应用程序,比如说 10 秒。

一般来说,图像非常相似,有时甚至相同,所以我想到了创建一个位图来表示当前打印屏幕与前一个打印屏幕之间的差异。

为了实现这一点,我逐个像素地比较 2 个图像,当它们相等时,我将像素设置为透明色(在原始代码中,我使用 Bitmap.LockBits更好的表现):

for (var x = 0; x < width; y++)
for (var y = 0; y < height; y++)
{
   var oldColor = lastPrint.GetPixel(x, y);
   var color = currentPrint.GetPixel(x, y);

   if (oldColor == color)
   {
        differencePrint.SetPixel(x, y, Color.Transparent);
   }
}

为了恢复图像,我获取了第一个打印屏幕并替换为顺序位图。

private void MergePrints()
    {
        var lastBitmap = new BitMap(firstPrint);
        foreach (var print in prints.OrderBy(e => e.Date))
        {
            using (var difference = new Bitmap(print.Image))
            {
                 using (var grfx = Graphics.FromImage(lastBitmap))
                 {
                     grfx.DrawImage(difference, 0, 0);
                 }                 
            }

            lastBitmap.Save(print.id + ".png");
        }
        lastBitmap.Dispose();
    }

我的问题是:除了具有透明像素的新图像之外,是否有更好的方法来生成表示两幅图像之间差异的对象?也许是一个新的 class?但是这个 class 需要保留,当然 "smaller" 而不是位图,目前我在使用 7zip 算法压缩后将位图保留为 byte[]。

您可以使用 code in this answer

它使用 LockBits 并且速度非常快。它假定格式为原生 ARGB 像素格式。

以两个Bitmaps为参数与returns相差Bitmap.

第3个参数让你从差异中恢复原样(如果你无损存储,推荐Png);这是为了仅允许更快地传输差异图像而编写的,因为对于只有很小的差异,它允许更好的压缩比。

这听起来和你的情况很相似,对吧?

直接回答问题:我看不出从哪里可以获得比 Png 开发人员更好的压缩或更方便的格式。作为额外的奖励,您可以随时 look 在差异处进行测试,立即查看变化的数量和分布..