绑定,我想不出更好的办法,出了每个像素对比之外另外本身大点的图片就算在windows下直接开打需要的时间都很长,我觉得这个是没办法避免的,否则3D中的渲染也就不那么耗费时间了

解决方案 »

  1.   

    整个将bitmap抓入数组处理,使用unsafe和指针,
    对r = Convert.ToInt32(c1.R) - 50 >= 0 ? Convert.ToInt32(c1.R) - 50 : 0;等使用位运算代替转换和条件判断
      

  2.   

    同上。处理图片想快就用LockBits拿到内存直接unsafe处理。下面代码的效率是原来的70-80倍,我的机器比较3200*1200的图片是80多ms,应该够用了。(工程需要设置允许unsafe代码)private Bitmap compareResultFast(Bitmap b1, Bitmap b2)
    {
        if (b1.Width != b2.Width || b1.Height != b2.Height)
            return null;    var fmt = PixelFormat.Format32bppArgb;
        var result = new Bitmap(b1);
        var rect = new Rectangle(0, 0, b1.Width, b1.Height);
        BitmapData d1 = null, d2 = null;
        try
        {
            d1 = result.LockBits(rect, ImageLockMode.ReadWrite, fmt);
            d2 = b2.LockBits(rect, ImageLockMode.ReadOnly, fmt);
            UnsafeBitmapCompare(d1.Scan0, d2.Scan0, d1.Height * d1.Stride);
        }
        finally
        {
            if (d1 != null)
                result.UnlockBits(d1);
            if (d2 != null)
                b2.UnlockBits(d2);
        }
        return result;
    }private unsafe void UnsafeBitmapCompare(IntPtr dest, IntPtr src, int length)
    {
        var dp = (uint*)dest; var sp = (uint*)src;
        var end = dp + length / 4;
        while (dp < end)
        {
            if (*dp == *sp || ((*dp >> 24 == 0) && (*sp >> 24 == 0)))
            {
                var r = (int)((*dp >> 16) & 0xFF) - 50;
                var g = (int)((*dp >> 8) & 0xFF) - 50;
                var b = (int)(*dp & 0xFF) - 50;
                r = r > 0 ? r : 0; g = g > 0 ? g : 0; b = b > 0 ? b : 0;
                *dp = (*dp & 0xFF000000) | (uint)(r << 16) | (uint)(g << 8) | (uint)b;
            }
            else
                *dp = 0xFFFF0000;        dp++; sp++;
        }
    }