php - lite - programa para ver metadatos de una imagen
¿Cómo eliminar exif de un archivo JPG sin perder calidad de imagen? (2)
Considere mantener el perfil ICC (que produce colores más ricos) al eliminar todos los demás datos EXIF:
- Extraer el perfil ICC
- Tira datos EXIF y perfil de imagen
- Añade el perfil ICC de nuevo
En PHP + imagick:
$profiles = $img->getImageProfiles("icc", true);
$img->stripImage();
if(!empty($profiles))
$img->profileImage("icc", $profiles[''icc'']);
(Nota importante: al usar ImageMagick 3.1.0 beta, el resultado que obtuve de getImageProfiles()
fue ligeramente diferente de la documentation . Recomendaría jugar con los parámetros hasta que obtenga una matriz asociativa con el (los) perfil (es) actual (es) )
Para la línea de comandos ImageMagick:
convert image.jpg profile.icm
convert image.jpg -strip -profile profile.icm output.jpg
Las imágenes se volverán a comprimir, por supuesto, si usas ImageMagick, pero al menos los colores se mantienen intactos.
Espero que esto ayude.
Tengo una aplicación para compartir fotos PHP en la que las imágenes subidas por el usuario se redimensionan en varios formatos de pulgar utilizando ImageMagick.
Como una forma aparentemente "inteligente" de ahorrar en el tamaño del archivo, estoy eliminando la información exif de estos pulgares de la siguiente manera:
$imagick = new Imagick($image);
$imagick->stripImage();
$imagick->writeImage($image);
Esto funciona. Quita la información EXIF, donde un pulgar de 30 KB ahorra 12 KB y se convierte en 18 KB. Un ahorro significativo al mostrar muchos de estos pulgares en una sola página.
Sin embargo, el problema es que funciona demasiado bien. Las imágenes resultantes parecen perder mucha información de color y se ven "planas" en comparación con sus versiones sin bandas.
Según mi investigación hasta ahora, mi teoría es que una o ambas de las siguientes afirmaciones son ciertas:
- Imagick desecha la información esencial del perfil de color como parte del proceso de eliminación.
- Imagick recomprime la imagen al guardarla, perdiendo calidad
Independientemente de la causa del problema, estoy buscando una manera de eliminar la información EXIF de tal manera que no afecte la calidad de la imagen o el color en sí.
¿Es esto posible?
Actualizar:
Basándome en la respuesta de Gerald Schneider, intenté imponer el ajuste de calidad al 100% antes de "eliminar" la imagen:
$imagick = new Imagick($image);
$imagick->setCompression(imagick::COMPRESSION_JPEG);
$imagick->setCompressionQuality(100);
$imagick->stripImage();
$imagick->writeImage($image);
Desafortunadamente, el problema permanece. A continuación se muestra una salida de ejemplo en la que, a pesar de establecer la calidad en 100%, las imágenes aún se aplanan.
Habiendo realizado cambios similares a los tipos MIME en los encabezados de archivos que se almacenaron incorrectamente, sugeriría que verifique la longitud de los datos EXIF a través de las herramientas estándar y luego "Cero" los datos manualmente usando funciones de cadena multibyte.
EXIF solo puede tener un máximo de 64 KB en un archivo JPEG, sin embargo, no estoy seguro de que sea exactamente de 64 KB, así que empezaré por esto.