Так почему же мне так сложно найти способ доказать это с помощью языков программирования? Я также попробовал следующую настройку в Python и Go, с сопоставимыми результатами iirc. Все они покажут расхождения в одном значении R, G или B, отличающемся от JPEG от PNG на один бит.
Код: Выделить всё
use image;
use std::env;
fn main() {
println!("Hello, world!");
let file1 = "image.png";
let file2 = "image.jpeg";
let img1 = image::open(file1).unwrap();
let img2 = image::open(file2).unwrap();
let img1_rgb = img1.to_rgb8();
let img2_rgb = img2.to_rgb8();
let mut img1_iter = img1_rgb.pixels();
let mut img2_iter = img2_rgb.pixels();
let mut i = 0;
let length = img1_iter.len();
while i < length {
let pixel1 = img1_iter.next();
let pixel2 = img2_iter.next();
println!("Pixel 1: {:?} Pixel 2: {:?}", pixel1, pixel2);
if pixel1 != pixel2 {
println!("Difference found: {:?}, {:?}", pixel1, pixel2);
}
println!();
i += 1;
}
}
Вот краткий пример Python, который демонстрирует то же самое:
Код: Выделить всё
from PIL import Image
png = Image.open("cat.png")
jpg = Image.open("cat.jpg")
pngPixels = png.load()
jpgPixels = jpg.load()
width, height = png.size
print("Width: ", width, "Height: ", height)
for x in range(width):
for y in range(height):
if pngPixels[x,y] != jpgPixels[x,y]:
print("Discrepancy at: ", x, " y: ", y)
print("png: ", pngPixels[x,y], "jpeg: ", jpgPixels[x,y])
print()
Код: Выделить всё
png = png.convert('RGB')
jpg = jpg.convert('RGB')
Я также экспериментировал с разными способами создания PNG из JPEG. Я пробовал экспортировать из GIMP, из Krita, с различными параметрами экспорта и даже с помощью одного или двух инструментов командной строки. Результаты все те же, iirc.
Моя единственная мысль заключается в том, что в jpeg встроен какой-то цветовой профиль, который не читается должным образом. эти библиотеки, но которые Krita/GIMP все еще учитывает. Как я могу обойти это? Какие шаги я могу предпринять, чтобы попытаться решить эту проблему? Я понимаю, что изображения действительно идентичны на уровне пикселей, но мне все равно хотелось бы найти способ «доказать» это с помощью задачи программирования.
Подробнее здесь: https://stackoverflow.com/questions/787 ... eg-is-iden