C++ 对于具有相同内容的图像,QImage::operator==是否可以返回false

C++ 对于具有相同内容的图像,QImage::operator==是否可以返回false,c++,qt,qimage,C++,Qt,Qimage,文件似乎模棱两可。它们是否意味着,如果图像内容的每个像素都相同,即使图像具有不同的编码,它也会返回true?他们说“不同格式”是什么意思?如果只是格式不同,但宽度/高度相同,并且像素具有相同的ARGB值怎么办 从: 布尔图像::运算符==(常量图像和图像)常量 如果此图像和给定图像的内容相同,则返回true; 否则返回false。比较可能很慢,除非有 一些明显的差异(例如不同的大小或格式),在这种情况下 该函数将快速返回 这意味着首先要检查的是大小和格式,如果大小和格式不同,函数会立即返回fal

文件似乎模棱两可。它们是否意味着,如果图像内容的每个像素都相同,即使图像具有不同的编码,它也会返回true?他们说“不同格式”是什么意思?如果只是格式不同,但宽度/高度相同,并且像素具有相同的ARGB值怎么办

从:

布尔图像::运算符==(常量图像和图像)常量

如果此图像和给定图像的内容相同,则返回true; 否则返回false。比较可能很慢,除非有 一些明显的差异(例如不同的大小或格式),在这种情况下 该函数将快速返回


这意味着首先要检查的是大小和格式,如果大小和格式不同,函数会立即返回
false
,因为很明显图像是不同的-这就是为什么函数会快速返回的原因,因为没有像素会被比较,这就是像素比较耗时最多的原因。很明显,为了使函数“快速”返回(即立即知道图像不同),大小或格式必须不同

除了格式外,两幅图像不可能具有相同的ARGB值,因为定义像素值的是格式-许多格式没有“A”通道,一些格式反转通道顺序(例如RGBA);有些格式与ARGB完全不同(例如Format_Mono)。看看文档中的
enumqimage::Format
,你就会明白了

具有不同格式的图片具有不同的内存大小和完全不同的像素值,您甚至无法以任何方式进行比较(因为没有标准方法进行比较,例如24位像素和16位像素,即使它们都是RGB);它们也不能看起来完全一样——这就是为什么人们发明了这么多不同的格式来满足不同的需求。格式定义了像素具有特定值的含义,因此它也决定了外观


因此,简单地总结一下:如果两个图像的尺寸或格式不同,在这个阶段,您已经可以说这些图像没有相同的内容,因此==操作符返回false就足够了。

那么这是否意味着如果图像在显示时看起来相同,它可以返回false(当然,同样的alpha通道值)?
那么这是否意味着如果图像看起来相同,它可能返回false
图像库没有眼睛。@PaulMcKenzie By“look same”我的意思是拥有相同的值,不管位的排列如何,就像文本文件中的文本可以是相同的,不管它是使用UTF-8还是UTF-16编码。对于这一点,它不需要“有眼睛”,对于图像也是一样。这样说,converttoargb32格式(img1)=converttoargb32格式(img2),img1==img2是否返回false?@sashoalm,对于图像,它是不同的,因为您没有对同一图像应用不同的编码,但是为了以不同的格式打开图像,您必须对其进行转换,即更改原始信息,这涉及到帧间/外推值、舍入或截断等。您可以将文本视为UTF-8或UTF-16和文本本身保持不变,但在不更改图像的情况下,您无法查看不同格式的图像。如果您有一个输入图像,请将其转换为两种不同格式,然后再次将其转换为相同格式,它们将不相同。它们将不同,因为在转换过程中会丢失/更改一些信息。请参阅e source here(第4897行):如果大小或格式不同,它显然返回false。