Tengo una foto en formato JPEG con resolución 4680x3120. Quiero agregar un borde blanco alrededor de esta foto, convirtiéndola en una foto de 5200x3467 (por motivos de impresión).
Claramente, no estoy alterando ni eliminando nada de la foto, simplemente estoy agregando algo. Por lo tanto, en principio, este procedimiento puede ser sin pérdidas. Sin embargo, si tuviera que usar Paint para agregar este borde, el proceso de guardado de Paint comprimirá la foto nuevamente en el formato JPEG, perdiendo así información y calidad.
¿Hay alguna forma (algún programa más profesional) de agregar algo a una foto JPEG, como un borde, sin afectar la parte original de la foto, sin reducir su calidad?
Aunque la respuesta de Philip es la mejor manera de hacerlo, es posible hacer lo que quieras completamente dentro de la esfera de JPEG.
JPEG funciona al dividir su imagen en bloques llamados Unidades mínimas de codificación (MCU), generalmente de 16 × 16 cada uno, y comprimiéndolos por separado. Puede ver esto en las imágenes cuando aumenta el nivel de compresión muy alto. A niveles de compresión más razonables, los bloques se mezclan tan suavemente que nunca se ven los bordes.
Podemos aprovechar este hecho para agregar sin pérdidas un borde blanco simple a una imagen. Simplemente tenemos que crear una matriz hueca de bloques blancos iguales al tamaño de la imagen de salida, luego soltar los bloques JPEG MCU originales en el medio.¹
Hay una desventaja en esa técnica: solo funciona cuando los tamaños de imagen de entrada y salida son múltiplos pares del tamaño de MCU. Cuando ese no es el caso, necesitamos volver a comprimir algunos de los bloques en el margen entre el borde blanco y los bordes de la imagen original. No verá esta diferencia en la salida si se mantiene alejado de los niveles de compresión JPEG excesivamente altos, por lo que sigue sin pérdidas.
No conozco ningún programa que solo haga esto. Lo más parecido que conozco es algo que hace la operación inversa: jpegtran tiene una función de recorte que corta sin pérdidas partes de los bordes de la imagen.² Lo hace descartando las MCU recortadas a lo largo de los bordes de la imagen, dejándolas en el medio intacto.
La solución lista para usar más simple que conozco es el complemento Better JPEG Lossless Resave para Photoshop. Utiliza técnicas basadas en las ideas anteriores para copiar MCU de la imagen original siempre que sea posible, con el fin de evitar volver a crearlas a partir de la versión sin comprimir, como suele hacer Photoshop.³
Digresiones:
Puede pensar que el borde resultante no será del todo blanco , ya que la pérdida de JPEG creará algún tipo de diferencia de color en la salida. Hice algunas pruebas, y al menos en Photoshop, una imagen puramente blanca guardada a través del nivel 10 de JPEG de Save For Web (es decir, calidad "baja") da como resultado una imagen decodificada que sigue siendo puramente blanca.
Lo determiné con dos pruebas:
Primero, cargué el JPEG como una capa encima del original, configuré el modo de fusión de la capa superior en Diferencia, luego agregué una capa de ajuste de Niveles encima para tratar de magnificar las diferencias. La imagen resultante permaneció negra, lo que indica que "no hay diferencia".
En segundo lugar, cuando no pude ver las diferencias esperadas, solté la capa de ajuste y devolví la capa JPEG al modo de fusión Normal, tomé la herramienta cuentagotas y busqué en toda la imagen un píxel que no se mostraba como RGB (255,255,255 ) en el panel Información. Nunca encontré uno. Esperaba ver los números parpadear un poco mientras frotaba la imagen, pero se mantuvieron firmes.
Solo puedo concluir que este es un caso degenerado del algoritmo de codificación: los bloques blancos puros permanecen blancos a través de la transformada de coseno discreta .
Curiosamente, esto no sucede con los bloques negros puros. Al menos con la implementación de Photoshop, se convierten en RGB (1,1,1) cuando se decodifican, no en RGB (0,0,0).
En pocas palabras, no necesita preocuparse por los puntos pulverizados en esta área del borde al imprimir una imagen producida con la técnica anterior.
jpegtran
es un programa de línea de comandos, pero también hay un programa GUI de Windows basado en el mismo código llamado jpegcrop
.
Por desgracia, este complemento es solo para Windows.
El punto a recordar aquí es que pierde calidad al guardar la foto en un formato de compresión con pérdida. Siempre que guarde la foto en un formato sin pérdidas (PSD, TIFF, etc.) después de agregar el borde, no perderá más datos de los que ya perdió al guardar la foto como JPEG en primer lugar.
No es del todo sin pérdidas, pero puedes acercarte bastante usando GIMP (o algún otro editor con una función similar) y los siguientes dos trucos:
Primero, asegúrese de que el borde que está agregando sea un múltiplo de 8 píxeles de ancho (y preferiblemente un múltiplo de 16 píxeles).
Esto es importante porque el algoritmo de compresión JPEG divide la imagen en bloques de 8 × 8 píxeles *, comenzando desde la esquina superior izquierda, y aplica el algoritmo de compresión con pérdida de forma independiente a cada bloque. Por lo tanto, al menos en principio, puede rellenar sin pérdidas una imagen JPEG agregando bloques completos de 8 × 8 píxeles alrededor de los existentes. Sin embargo, si intentara agregar un borde que no tuviera un número entero de bloques de ancho, los bloques de la imagen rellenada no se alinearían con los del original y sería inevitable cierta pérdida de compresión.
*) En realidad, la mayoría de las imágenes JPEG utilizan submuestreo de croma , lo que significa que solo la parte de escala de grises de la imagen se comprime en bloques de 8×8, mientras que los canales de croma se reducen en un 50% antes de la compresión, lo que hace que su tamaño de bloque efectivo sea de 16×. 16 píxeles Por lo tanto, para obtener los mejores resultados, el ancho de su borde debería ser realmente un múltiplo de 16 píxeles. Sin embargo, normalmente puede salirse con la suya con un borde de 8 (o 24 o 40, etc.) píxeles, ya que no se nota mucho una pequeña pérdida de compresión en el croma.
La segunda parte del truco es, al guardar la imagen final, seleccionar la casilla de verificación "Usar la configuración de calidad de la imagen original" en el cuadro de diálogo Exportar imagen como JPEG (en Configuración avanzada). ¡Haga esto incluso si parece que resultaría en una calidad inferior a la que normalmente usaría!
Esta configuración hace que GIMP reutilice exactamente la misma configuración de compresión que se usó para la imagen original, lo que generalmente elimina alrededor del 99% de las pérdidas de compresión, siempre que no haya editado demasiado la imagen y, en particular, que los bloques en el la nueva imagen aún se alinea con las del original. (Ocasionalmente todavía habrá algunas pérdidas debido a errores de redondeo, pero mucho menos de lo que habría de otra manera).
Como una demostración rápida, tomé esta imagen de prueba JPEG de Wikimedia Commons , originalmente guardada con una configuración de calidad bastante baja de 50, y le agregué un elegante (más o menos) borde en blanco y negro de 8px usando el método descrito anteriormente:
Aquí está la diferencia entre la imagen original (15,1 kB) y la imagen editada (16,7 kB), que se muestra usando el modo de capa "Extracción de grano" de GIMP:
Puede ver algunos errores de croma muy leves, causados por el ancho del borde que no es un múltiplo de 16 y (si observa detenidamente) algunos bloques en los que también hubo pérdidas menores en el canal luma debido al redondeo. Aún así, visualmente, la imagen original y la rellenada son prácticamente indistinguibles, incluso con un aumento de 2x y alternando entre ellas.
En particular, compare esto con el resultado de aumentar la calidad JPEG de 50 a 60 antes de guardar la imagen rellenada, lo que produce la siguiente imagen de 17,6 kB:
Con un gran aumento, definitivamente puede ver que la imagen editada es notablemente más borrosa en algunos lugares que la original, y tomar la diferencia con Grain extract lo confirma:
compare
, obtengo un PSNR de 34.5826 para el JPEG original, 34.5752 para la copia guardada con la misma configuración de calidad y 34.3653 para la guardada en q40. ¿Suficientemente bueno?Lo siento si esto no es exactamente lo que querías, pero...
Parece que está agregando un borde blanco como ayuda para posicionar su imagen al imprimir. ¿Por qué no centrarse en aprender las interfaces de impresión correctamente y evitar trucos poco fiables como este? El otro problema que esto plantea es si permite que el programa de impresión cambie el tamaño de su imagen de 4680x3120 para que se ajuste a la resolución/DPI correcta. Esto podría tener un efecto más grave que volver a guardar un jpeg.
Las respuestas anteriores son muy buenas.
Solo agregaré algunos "aspectos psicológicos" del formato jpg.
Si un jpg está bien preparado, solo pierde alrededor de un 0,5% de información. Eso es en la gran mayoría de los casos algo que el ojo humano no puede ver. Necesita un programa para hacer algunos análisis y ver las diferencias (como el análisis que acaba de hacer Ilmari).
"Buena calidad" es un proceso, no solo la forma en que un formato de archivo guarda la imagen. Sí, recomprimiste el archivo con jpg una vez más porque realmente lo necesitabas. Si está en una situación controlada, está bien hacerlo.
Realmente lo necesitabas implica que no puedes usar otro formato sin pérdidas, tienes necesidades de almacenamiento o software muy específicas, o un flujo de trabajo muy ajustado.
Si está realmente preocupado por la calidad, probablemente no usaría Paint. El formato JPG tiene algunas configuraciones que no puede controlar en absoluto en Paint.
Aquí está mi lista de programas gratuitos donde realmente puede controlar la compresión de jpg y la opción que debe seleccionar. (Todos ellos en el cuadro de diálogo Guardar jpg)
Irfanview: active Deshabilitar el submuestreo de color de croma.
Visor de imágenes FastStone - Submuestreo de color: ninguno.
Gimp - Submuestreo 4:4:4
Conclusión. No uses pintura.
Una cosa que no he comprobado todavía. Si todos estos programas mantienen el perfil de color incrustado. Editaré mi publicación más tarde.
IrfanView me funciona bien para conjuntos de imágenes. Aquí hay algunas notas prácticas
Aquí está mi procedimiento almacenado para la inserción de bordes - Procedimiento Infran para agregar un borde
¡Puedes hacer esto gratis usando Adobe Acrobat! Haga clic derecho en su foto, luego haga clic en Abrir con Adobe Acrobat. En Adobe, haga clic en Editar PDF. Seleccione la imagen completa (Ctrl A) y luego hágala un poco más pequeña para que haya un borde blanco alrededor. Luego haga clic en Exportar como y seleccione el formato deseado (JPEG, PNG, etc.).
Super gato
mattdm
jpegtran
la función de recorte también se puede usar para extender. (Sin embargo, no estoy seguro de qué color terminan siendo los bordes extendidos).Warren joven
jpegtran
también puede extender la imagen, pero siempre se rellena con un gris medio codificado, RGB (128,128,128). Lo hace simplemente porque es la única opción fácil, ya que en el espacio de coeficiente DCT, puede hacerlo con una simplebzero()
llamada. Intenté un truco salvaje para cambiar esto , que no funciona, pero debería darle una idea de la fealdad involucrada. levanta las manos con frustraciónilmari karonen
Warren joven
JBLOCK
matrices 2D, por lo que estoy escribiendo en un espacio de memoria que no me pertenece. Siéntase libre de hacer su propio parche o un riff en el mío. Creo que perseguí a este conejo tan lejos como pude por el agujero.Hobbs
Rafael
Warren joven