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

时间:2015-03-02 14:39:16

标签: c# image performance bitmap system.drawing

我正在开发一个定期保存打印屏幕的应用程序,让我们说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();
    }

我的问题是:除了带有透明像素的新图像之外,还有更好的方法来生成表示2幅图像之间差异的对象吗?也许是新课?但是这个课程需要坚持下去,当然还需要更小的课程。比起位图,目前我在使用7zip算法对位图进行压缩后将其保存为byte []。

1 个答案:

答案 0 :(得分:0)

您可以使用code in this answer

执行此操作

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

它需要两个Bitmaps作为参数,并返回差异Bitmap

第3个参数可让您从差异中恢复原始内容(如果您无损地存储它,建议使用Png);这是为了允许更快地传输差异图像,因为只有很小的差异,它允许更好的压缩比。

这听起来与你的情况非常相似,对吧?

直接回答这个问题:我无法看到你可以获得比Png的开发者更好的压缩或更简单的格式..作为一个额外的奖励,你总是可以测试的差异,并立即看到变化的数量和分布..