Closed Hernan4444 closed 8 years ago
Hola! Como lo hiciste con los CRC? Saludos
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
Para los otros (header,IHDR y IEND) usaste los mismos que obtuviste al leer el archivo, o los recalculaste?
los mismos
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.
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.
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!
@IIC2233-2016-1/tareos
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.
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!
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
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.
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.
Pero, en photoshop y pycharm cuando intento abrir el archivo me lo abre correctamente
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
@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
@santiagocruzb has probado calculando el CRC del IDAT a partir de "IDAT".encode() + bytes_matriz_no_comprimida
?
@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)
@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
http://stackoverflow.com/questions/24082305/how-is-png-crc-calculated-exactly
@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.
@Hernan4444 Si me funciono!
Funcionó perfecto. Gracias @jonnylee719 !!!!!!!!!
@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.
Kudos @jonnylee719 👍 @Hernan4444 Recuerda cerrar el issue si se solucionó el problema
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.