Допустим, я анализирую файл изображения с несколькими различными библиотеками и запрашиваю у библиотеки значение RGB в пикселях (20, 30).
При каких условиях я могу ожидать получения согласованных результатов для разных библиотек и версии библиотеки?
Интуитивно я бы предположил, что с более простыми форматами, такими как PPM или (с некоторыми ограничениями) BMP, я, вероятно, мог бы ожидать согласованных результатов, а с JPEG я бы получил результаты повсюду даже в относительно простых случаев, когда этого не избежать.
Это заставляет меня думать о PNG: если я беру входное изображение, конвертирую его в PNG с заданной глубиной цвета (например, 8-битный на канал RGBA, с все значения прозрачности установлены на полностью непрозрачные) и нет цветового профиля, если я могу ожидать:
все распространенные библиотеки будут интерпретировать результирующий PNG таким же образом (давая тот же массив Значения RGB (A) при чтении файла)?
все распространенные библиотеки, чтобы иметь возможность повернуть указанный массив значений RGB (A) обратно в PNG, который все общие библиотеки будут интерпретировать одинаково?
(Очевидно, сами байты файла, вероятно, будут другими из-за метаданных, порядка пакетов и т. д. c . - Я говорю здесь только о значениях пикселей. Кроме того, очевидно, что на начальном этапе преобразования изображение может измениться, если исходный вход имел цветовой профиль et c.)
Например, если вы получили этот образец файла:
wget https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/Sun_getting_through_fog_in_the_New_Zealand_bush%2C_Bryant_Range.jpg/500px-Sun_getting_through_fog_in_the_New_Zealand_bush%2C_Bryant_Range.jpg
затем декодируйте с помощью Python:
import PIL.Image
img = PIL.Image.open('500px-Sun_getting_through_fog_in_the_New_Zealand_bush,_Bryant_Range.jpg')
print(img.getpixel((100,100))) # prints (73, 50, 60)
, вы получите другие результаты, чем с Golang:
package main
import (
"fmt"
"image"
"log"
"os"
"image/color"
_ "image/jpeg"
_ "image/png"
)
func main() {
reader, err := os.Open("500px-Sun_getting_through_fog_in_the_New_Zealand_bush,_Bryant_Range.jpg")
if err != nil {
log.Fatal(err)
}
m, _, err := image.Decode(reader)
if err != nil {
log.Fatal(err)
}
c := m.At(100, 100).(color.YCbCr)
fmt.Printf("%+v\n", c)
r, g, b := color.YCbCrToRGB(c.Y, c.Cb, c.Cr)
fmt.Printf("%v %v %v\n", r, g, b) // prints 72 50 59
}
GIMP декодирует пиксель (100, 100) как (73, 50, 60), т.е. то же самое, что и PIL, если в диалоговом окне профиля выбрать «Сохранить».