Может ли QImage::operator== возвращать false для изображений с одинаковым содержимым

Документы кажутся неоднозначными. Означают ли они, что он возвращает true, если каждый пиксель содержимого изображения одинаков, даже если изображение имеет другую кодировку? Что они имеют в виду, когда говорят «другой формат» — что, если только формат другой, но ширина/высота одинаковы, а пиксели имеют одинаковые значения ARGB?

Из документации:

bool QImage::operator== ( const QImage & image ) const

Возвращает true, если это изображение и заданное изображение имеют одинаковое содержимое; в противном случае возвращает ложь. Сравнение может быть медленным, если нет какой-либо очевидной разницы (например, другого размера или формата), и в этом случае функция вернется быстро.


person sashoalm    schedule 13.07.2014    source источник
comment
Посмотрите на исходник здесь (строка 4897): qt.gitorious.org/qt/qt/source/ Он явно возвращает false, если размер или формат отличаются.   -  person Brandin    schedule 13.07.2014


Ответы (1)


Они означают, что первое, что проверяется, это размер и формат, и если они отличаются, функция сразу возвращает false, так как очевидно, что изображения разные — поэтому функция вернет быстро, так как никакие пиксели не будут сравниваться, и это сравнение пикселей, которое занимает больше всего времени. Им ясно, что размер ИЛИ формат должны быть разными, чтобы функция возвращалась «быстро» (т.е. сразу знала, что изображения разные).

На самом деле невозможно, чтобы, за исключением формата, два изображения имели одинаковые значения ARGB, потому что именно формат определяет значения пикселей — многие форматы не имеют канала «A», некоторые форматы меняют порядок каналов ( например, RGBA); есть форматы, которые вообще не имеют ничего общего с ARGB (например, Format_Mono). Взгляните на enum QImage::Format в документации, и вы поймете.

Изображения, имеющие разные форматы, имеют разный объем памяти и совершенно разные значения пикселей, которые вы даже никак не можете сравнить (поскольку нет стандартного способа сравнения, например, 24-битного пикселя и 16-битного пикселя, даже если они оба RGB); они также не могут выглядеть совершенно одинаково — вот почему люди придумали так много разных форматов для разных нужд. Формат определяет, что означает, что пиксель имеет определенное значение, поэтому он также определяет внешний вид.

Итак, подведем краткий итог: если размеры или формат двух изображений различаются, уже на этом этапе можно сказать, что эти изображения не имеют одинакового содержания, поэтому информации достаточно для == оператор для возврата false.

person KjMag    schedule 13.07.2014
comment
Значит ли это, что он может возвращать false, если изображения будут выглядеть одинаково при отображении (конечно, с теми же значениями альфа-канала)? - person sashoalm; 13.07.2014
comment
So does that mean it can return false if the images would look the same У библиотеки изображений нет глаз. - person PaulMcKenzie; 13.07.2014
comment
@PaulMcKenzie Под одинаковым видом я подразумеваю одинаковые значения, независимо от битовой упаковки, вроде того, как текст внутри текстового файла может быть одинаковым, независимо от того, использует ли он кодировку UTF-8 или UTF-16. И для этого не нужно было бы иметь глаза, то же самое и для изображений. Другими словами, convertToARGB32Format(img1) == convertToARGB32Format(img2), будет ли img1 == img2 возвращать false? - person sashoalm; 13.07.2014
comment
@sashoalm, с изображениями все по-другому, потому что вы не применяете разные кодировки к одному и тому же изображению, но для того, чтобы открыть изображение в другом формате, вы должны его преобразовать, т.е. изменить исходную информацию, что включает в себя промежуточные/экстраполяционные значения, округление или их усечение и т. д. Вы можете просматривать текст как UTF-8 или UTF-16, и сам текст остается неизменным, но вы не можете просматривать изображение в другом формате, не изменяя его. Если у вас есть одно входное изображение, преобразовать его в два разных формата, а затем снова преобразовать в тот же формат, они не будут одинаковыми. - person KjMag; 13.07.2014
comment
Они будут отличаться, потому что при конвертации будут теряться/меняться некоторая информация. - person KjMag; 13.07.2014
comment
@user3564091 user3564091 Нет, если вы увеличите масштаб формата - преобразование из 1-битного монохромного растрового изображения в 32-битное ARGB не приведет к потере информации. Вот почему я использовал convertToARGB32Format() - он содержит максимум информации из всех форматов изображений Qt, поэтому при преобразовании в него никакая информация не может быть потеряна. - person sashoalm; 13.07.2014
comment
@sashoalm, вы проверили, что это действительно работает, или вы предполагаете? - person KjMag; 13.07.2014