Tag: memcmp

为什么位图比较不等于自身?

这有点令人费解。 以下代码是一个小测试应用程序的一部分,用于validation代码更改未引入回归。 为了加快速度,我们使用了memcmp ,它似乎是比较两个相同大小图像的最快方法 (不出所料)。 但是,我们有一些测试图像显示出一个相当令人惊讶的问题:位图数据上的memcmp告诉我们它们不相等,但是,逐像素比较根本没有发现任何差异。 我的印象是,在Bitmap上使用LockBits ,您会得到图像的实际原始字节。 对于24 bpp位图,有点难以想象像素相同但基础像素数据不相同的情况。 一些令人惊讶的事情: 差异始终是单个字节,在一个映像中为00在另一个映像中为FF 。 如果将Format32bppRgb的PixelFormat更改为Format32bppRgb或Format32bppArgb ,则比较成功。 如果将第一个LockBits调用返回的BitmapData作为第四个参数传递给第二个参数,则比较成功。 如上所述,逐像素比较也成功。 我有点难过,因为坦率地说我无法想象为什么会这样。 (简化)代码如下。 只需使用csc /unsafe编译,并将24bpp的PNG图像作为第一个参数传递。 using System; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; class Program { public static void Main(string[] args) { Bitmap title = new Bitmap(args[0]); Console.WriteLine(CompareImageResult(title, new Bitmap(title))); } private static string CompareImageResult(Bitmap bmp, Bitmap expected) { […]