PIL jpeg, como preservar el color del pixel

Tengo algunos experimentos con JPEG, el documento dijo que “100 desactiva completamente la etapa de cuantización de JPEG”.

Sin embargo, todavía tengo algunas modificaciones de píxeles durante el almacenamiento. Aquí está mi código:

import Image red = [20,30,40,50,60,70]; img = Image.new("RGB", [1, len(red)], (255,255,255)) pix = img.load() for x in range(0,len(red)): pix[0,x] = (red[x],255,255) img.save('test.jpg',quality=100) img = Image.open('test.jpg') pix = img.load() for x in range(0,len(red)): print pix[0,x][0], 

Obtuve resultados inesperados: 22 25 42 45 62 65 ¿Qué debo hacer para conservar el valor de píxel? Tenga en cuenta que también probé con PHP usando imagejpeg y me da el valor correcto cuando quality = 100.

Puedo usar png para preservar, pero quiero saber la razón detrás de esto y si hay alguna opción para evitar

JPEG consta de muchos pasos diferentes, muchos de los cuales introducen alguna pérdida. Al utilizar una imagen de muestra que contiene solo rojo, probablemente se haya cruzado con el peor de los delincuentes: submuestreo o submuestreo de croma . La mitad de la información de color se desecha porque el ojo es más sensible a los cambios de brillo que a los cambios de color.

Algunos codificadores JPEG pueden configurarse para desactivar el submuestreo, incluidos PIL y Pillow estableciendo el subsampling=0 . En cualquier caso, no le dará un archivo completamente sin pérdida, ya que todavía hay otros pasos que introducen una pérdida.

JPEG siempre conllevará el riesgo de pérdida, consulte ¿No se pierde Jpeg cuando la calidad se establece en 100? .

Su mejor opción es usar otro formato, especialmente si sus experimentos son para la ciencia 🙂 Incluso si se ve obligado a comenzar con JPEG (lo que parece poco probable), debe convertir inmediatamente a un formato sin pérdidas para cualquier tipo de análisis y modificación.

Si realmente quieres probar el trabajo JPEG sin pérdida con python, puedes probar jpegtran , “el software de transformación de imagen jpeg sin pérdida del Independent Jpeg Group” , pero como observa @Mark, esto no te llevará muy lejos.

Por cierto, la cuantización se usa en compresión con o sin pérdida por igual, por lo que mi conjetura es que

… 100 desactiva completamente la etapa de cuantización de JPEG. [1]

simplemente significa que no está comprimido en absoluto.