🖼️ Imágenes JPG
Con pérdida: orientado a fotografía y de tamaño reducido
102,400 bytes
image/jpeg
104,857,600 bytes
image/jpeg
10,240 bytes
image/jpeg
10,485,760 bytes
image/jpeg
1,048,576 bytes
image/jpeg
26,214,400 bytes
image/jpeg
512,000 bytes
image/jpeg
52,428,800 bytes
image/jpeg
5,242,880 bytes
image/jpeg
Acerca de Imágenes JPG
JPEG (Joint Photographic Experts Group) es un formato de imagen con pérdida. Comprime muy bien las imágenes de tono continuo como las fotografías, por lo que domina la imagen web y el almacenamiento de las cámaras. Su tipo MIME es image/jpeg, con las extensiones .jpg y .jpeg.
Hay tamaños desde 10 KB hasta 100 MB, para probar funciones de subida de medios, verificar sistemas de gestión de fotos y medir librerías de optimización de imágenes.
Características de JPEG
- Con pérdida: la calidad se degrada en cada guardado, así que no sirve como formato intermedio de edición
- Sin transparencia: usa PNG o WebP cuando necesites canal alfa
- Puede llevar EXIF con fecha de captura, coordenadas GPS y orientación: eliminar la ubicación es obligatorio en subidas de usuarios
- Ignorar la etiqueta de orientación hace que las fotos verticales se muestren tumbadas
Referencias y artículos relacionados
📖 Dónde se suele tropezar
PNG, JPEG, GIF y WebP en tamanos de 1 KB a 100 MB, para limites de subida, generacion de miniaturas y ejercitar librerias de imagen. Lo que distingue a los formatos esta descrito arriba; lo que hace tropezar a una implementacion suele ser comun a todos.
| Caso | Qué ocurre | Qué hacer |
|---|---|---|
| Una imagen pequena agota la memoria | La memoria depende del numero de pixeles decodificados, no del tamano del fichero. Un PNG de 20 KB a 10.000 por 10.000 pixeles pide unos 400 MB en RGBA. | Limita las dimensiones aparte de los bytes. Puedes leer ancho y alto de la cabecera antes de decodificar: getimagesize() en PHP, o en Pillow justo tras Image.open() y antes de load(). |
| Las fotos verticales se muestran tumbadas | La camara no rota los pixeles: anota en la etiqueta EXIF de orientacion como estaba sujeta. Cualquier cosa que ignore la etiqueta muestra la orientacion del sensor. | Lee la orientacion antes de generar la miniatura, aplica el giro de verdad y luego borra la etiqueta. Girar y dejar la etiqueta hace que los navegadores conformes giren otra vez. Inspecciona un fichero con el visor EXIF. |
| La conversion se lleva la animacion y la transparencia | Una conversion que pasa por un canvas del navegador solo sostiene un fotograma, asi que un GIF animado queda en el primero. Al convertir a JPEG, la transparencia se aplana a blanco o negro. | Para conservar la animacion necesitas algo que entienda varios fotogramas: ImageMagick o libvips en lugar de un canvas. Para conservar la transparencia, apunta a PNG o WebP. |
| Un archivo que parece imagen no lo es | La extension y el Content-Type son afirmaciones de quien envia. Una imagen con otros datos anadidos al final se abre con normalidad en un visor. |
Comprueba los bytes iniciales y luego recodifica antes de guardar. Decodificar y volver a escribir descarta tanto los datos anadidos como los metadatos incrustados. Las secuencias estan en la referencia de magic bytes. |
Al servir imagenes subidas por usuarios tal cual, hay una excepcion que importa: un SVG no es una imagen en el sentido relevante. Es un documento capaz de ejecutar script, asi que servirlo desde tu propio origen abre una via de cross-site scripting. Sirvelo desde otro dominio o contenlo con Content-Security-Policy y Content-Disposition: attachment.