IIC2233-2016-1 / syllabus

Página principal del curso
32 stars 34 forks source link

Ayuda Imagenes png #555

Closed Hernan4444 closed 8 years ago

Hernan4444 commented 8 years ago

Realice el código para abrir un png y poder cambiar a sepia, negativo, grises, rotar, etc. El tema es que con las imágenes que mandaron para la AC de bytes del semestre pasado me funciona perfectamente, pero cuando busco imagenes png en internet en formato rgb (el mismo que las otras imagenes) no me los cambia bien, incluso cuando no edito nada, solo las abro y vuelvo a escribir me las guarda diferente y siento que puede ser porque están comprimidas de otro modo.

Como no experto en el tema de png quería saber si algún ayudante sabe sobre esto, ¿las imágenes están en otro tipo de compresión o es mi código el que estar mal?

Edit: subi el codigo a mi repositorio por si algun ayudante decide ver donde esta el error.

santiagocruzb commented 8 years ago

Hola! Como lo hiciste con los CRC? Saludos

Hernan4444 commented 8 years ago

El unico crc que me molestaba era el del IDAT, despues de comprimir el idat, hago el metodo crc32 al byte "IDAT" que me retorna un numero, ese numero lo transformo a byte y lo añado al final del idat

santiagocruzb commented 8 years ago

Para los otros (header,IHDR y IEND) usaste los mismos que obtuviste al leer el archivo, o los recalculaste?

Hernan4444 commented 8 years ago

los mismos

jonnylee719 commented 8 years ago

image

Para los filtros, png archivos pueden ser bastante complejos. Entonces, cuales los color tipos que necesitamos hacer? He adjuntado un diagrama de todos los tipos.

image

Cuales los supuestos sobre las images png? Podemos asumir que las images solamente tienen IHDR chunk, IDAT chunks, IEND chunk y nada mas? Estoy asumiendo que las imagenes solamente tienen color type: 0, 2.

Enlace

santiagocruzb commented 8 years ago

Intentando simplemente recortar los chunks de IHDR, IDAT y IEND, pude pegarlos (sin editar) y guardar bien la foto (por ende los otros chunks son solo información extra). Pero editando el idat, no me da. Estoy seguro de estar editando bien (la cantidad de bytes que tengo es correcta) esa parte y yo creo que los problemas los tengo pegando los chunks de vuelta. Algún ayudante que se apiade revisando el código?? Saludos!

aaossa commented 8 years ago

@IIC2233-2016-1/tareos

vjmoreno commented 8 years ago

A mi me pasa lo mismo, con las imágenes de la AC del semestre pasado me funciona bien, pero cuando utilizo una imagen sacada de otra parte no me funciona. Revisé el numero de bytes de los IDAT en el momento previo a descomprimirlos y al momento de volver a comprimirlos, y el numero no calza. No comprendo bien el uso de zlib.compress(), puesto que trae diferentes niveles de compresión y no se si usar el que viene por default o usar otro.

flobarrios commented 8 years ago

Hola ! perdón por la demora. Pueden asumir que se solo se probará con imágenes del mismo tipo de la AC del semestre pasado (como se detalla en el enunciado). Saludos!

jonnylee719 commented 8 years ago

Ayudantes y @Hernan4444 (se que ya has hecho esta parte) Has tenido problema mostrando los imagenes filtrados en QPixmap? Es que puedo abrir las imagenes en Atom y otra software pero me tira libpng error: IDAT: CRC error usando QPixmap

Hernan4444 commented 8 years ago

Sip, tambien tuve ese problema, eso pasa porque el CRC cambia cada vez que cambias algun dato de lo imagen. Buscando en intenet me di cuenta que para actualizarlo tienes que aplicar el metodo crc32 a todo el chunk EXCEPTO al nombre del chunk:

Es decir, si un chunk tiene: 1) largo (4 bytes) 2) nombre (4 bytes) 3) informacion (x bytes)

El CRC sera (el resultado de aplicar crc32 a (largo + informacion)) Nota: ese resultado sera un numero, tienes que transformarlo a bytes de largo 4 Nota_2: El crc del IHDR tambien tiene que ser modificado si es que cambiaste alguna información como el color.

santiagocruzb commented 8 years ago

Pero @Hernan4444, me pasa que tratando de transformar la imagen, con el método de aplicar CRC solo a la información o a la información + el numero del largo, mi computador no entiende el nuevo archivo como tal. screen shot 2016-06-12 at 10 35 39 am

screen shot 2016-06-12 at 10 35 48 am

Pero, en photoshop y pycharm cuando intento abrir el archivo me lo abre correctamente

screen shot 2016-06-12 at 10 35 12 am

Luego intentando cargar el archivo (o como bytearray) como un QPixmap que contiene un QImage (espero que se entienda), me muestra el error de @jonnylee719 + QPixmap::scaled: Pixmap is a null pixmap. Mis preguntas son si tu puedes editar bien el archivo, guardarlo y abrirlo como corresponde, y si puedes cargar la imagen como bytes sin tener la necesidad de guardar la imagen como archivo. Saludos

Hernan4444 commented 8 years ago

@santiagocruzb A mi me fuciona perfectamente, que pyqt es super sensible a los bytes de la imagen, un solo byte malo y te manda error.

Hay que considerar: el orden es largo + informacion. La informacion del idat tiene que estar comprimida con args 9, es decir compress(idat, 9) el largo debe ser de la informacion comprimida en forma de byte de tamaño 4

edit: Y si a tu segunda pregunta, logro leer la imagen como bytes, editarla y cargarla de inmediato, no hay necesidad de guardar la imagen

rodolfopalma commented 8 years ago

@santiagocruzb has probado calculando el CRC del IDAT a partir de "IDAT".encode() + bytes_matriz_no_comprimida?

santiagocruzb commented 8 years ago

@rpalmaotero lo intento y lo mismo: no se guarda bien como archivo, pero pycharm me muestra la imagen en blanco y negro. Asumo también que cuando te refieres a matriz no comprimida es a una lista (hice todo el proceso de no tocar los primeros bytes de cada fila)

jonnylee719 commented 8 years ago

@Hernan4444 @santiagocruzb @rpalmaotero Gracias, al final busque por internet y la calculacion del CRC del IDAT es a partir del tipo + bytes_comprimida para IDAT y tipo + bytes_no_comprimida para IHDR (porque no tiene que ser comprimida)

Todavia no entiendo porque existe tres maneras distintas que funcionan: con largo + informacion, tipo + bytes no comprimida, y tipo + bytes comprimida

Mas informacion image

http://stackoverflow.com/questions/24082305/how-is-png-crc-calculated-exactly

Hernan4444 commented 8 years ago

@jonnylee719 Y te funciono todo bien?? pyqt te lo abre??

Porque por mi parte aplique el mismo algoritmo al ihdr e idat y funciono, pero talvez fue pura suerte.

jonnylee719 commented 8 years ago

@Hernan4444 Si me funciono!

image

santiagocruzb commented 8 years ago

Funcionó perfecto. Gracias @jonnylee719 !!!!!!!!!

Hernan4444 commented 8 years ago

@jonnylee719 Al final fue pura suerte, revise mi codigo es una una linea invertía las variables largo y tipo, es decir siempre puse tipo + información, solo que no me daba cuenta. Prefiero decirlo aquí por si alguien mas ve el issues para que no intente largo + información.

negebauer commented 8 years ago

Kudos @jonnylee719 👍 @Hernan4444 Recuerda cerrar el issue si se solucionó el problema