Почему я не могу доказать с помощью программирования, что PNG, созданный из JPEG, идентичен для любого данного пикселя?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему я не могу доказать с помощью программирования, что PNG, созданный из JPEG, идентичен для любого данного пикселя?

Сообщение Anonymous »

Таким образом, png-файлы не имеют потерь — это означает, что они сжимаются таким образом, что никакие данные, которые они представляют, не теряются. Поэтому PNG, созданный из JPEG, должен быть идентичным по пикселям, при условии одинаковой глубины цвета и той же глубины цвета и да-да-да. И действительно, это достаточно легко доказать, открыв Krita или GIMP и вручную проверив JPEG и PNG, созданный из JPEG, на уровне пикселей, считывая отдельные значения RGB для тех же произвольных пикселей.

Так почему же мне так сложно найти способ доказать это с помощью языков программирования? Я также попробовал следующую настройку в 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;
}
}

Оба изображения должны храниться как 8-битное значение RGB. Однако, когда я рассматриваю образец ввода изображения, который в основном чисто желтый (R и G 255, синий 0) как в формате JPEG, так и в PNG-изображении через Krita и Gimp, моя программа вместо этого сообщит, что jpeg имеет значения 254, 254, 0. для желтых пикселей. Другие цвета, найденные в моем изображении, также будут отличаться на один бит для каждого значения цвета — иногда оно ограничивается одним значением цвета, а иногда несколькими (как в случае с чистым желтым).
Вот краткий пример 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')
Мне кажется странным, что все три библиотеки программирования, которые я тестирую, неверны, но еще более странно, что Krita и GIMP не могут правильно понять что-то вроде цвета пикселя. . Так что же здесь происходит?
Я также экспериментировал с разными способами создания PNG из JPEG. Я пробовал экспортировать из GIMP, из Krita, с различными параметрами экспорта и даже с помощью одного или двух инструментов командной строки. Результаты все те же, iirc.

Моя единственная мысль заключается в том, что в jpeg встроен какой-то цветовой профиль, который не читается должным образом. эти библиотеки, но которые Krita/GIMP все еще учитывает. Как я могу обойти это? Какие шаги я могу предпринять, чтобы попытаться решить эту проблему? Я понимаю, что изображения действительно идентичны на уровне пикселей, но мне все равно хотелось бы найти способ «доказать» это с помощью задачи программирования.

Подробнее здесь: https://stackoverflow.com/questions/787 ... eg-is-iden
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»