Saltar al contenido

Eliminar datos EXIF ​​de JPG usando PHP

Contamos con tu ayuda para extender nuestros enunciados en referencia a las ciencias de la computación.

Solución:

Una forma rápida de hacerlo en PHP usando ImageMagick (suponiendo que lo tengas instalado y habilitado).

stripImage();
        $img->writeImage($image);
        $img->clear();
        $img->destroy();

        echo "Removed EXIF data from $image. n";

     catch(Exception $e) 
        echo 'Exception caught: ',  $e->getMessage(), "n";
       

?>

Utilizar gd recrear la parte gráfica de la imagen en una nueva, que guardes con otro nombre.

Ver PHP gd


editar 2017

Utilice la nueva función Imagick.

Abrir imagen:

Asegúrese de mantener cualquier perfil ICC en la imagen

    $profiles = $img->getImageProfiles("icc", true);

luego quitar la imagen y volver a colocar el perfil, si corresponde

    $img->stripImage();

    if(!empty($profiles)) 
       $img->profileImage("icc", $profiles['icc']);
    

Viene de esta página de PHP, vea el comentario de Max Eremin al final de la página.

Estaba buscando una solución a esto también. Al final, usé PHP para reescribir el JPEG con TODOS los datos Exif eliminados. No necesitaba nada de eso para mis propósitos.

Esta opción tiene varias ventajas...

  • El archivo es más pequeño porque los datos EXIF ​​se han ido.
  • No hay pérdida de calidad de imagen (porque los datos de la imagen no se modifican).

También una nota sobre el uso de imagecreatefromjpeg: probé esto y mis archivos se hicieron más grandes. Si configura la calidad en 100, su archivo será MÁS GRANDE, porque la imagen se volvió a muestrear y luego se almacenó sin pérdidas. Y si no usas calidad 100, pierdes calidad de imagen. La ÚNICA forma de evitar el remuestreo es no usar imagecreatefromjpeg.

Aquí está mi función...

/**
 * Remove EXIF from a JPEG file.
 * @param string $old Path to original jpeg file (input).
 * @param string $new Path to new jpeg file (output).
 */
function removeExif($old, $new)

    // Open the input file for binary reading
    $f1 = fopen($old, 'rb');
    // Open the output file for binary writing
    $f2 = fopen($new, 'wb');

    // Find EXIF marker
    while (($s = fread($f1, 2))) 
        $word = unpack('ni', $s)['i'];
        if ($word == 0xFFE1) 
            // Read length (includes the word used for the length)
            $s = fread($f1, 2);
            $len = unpack('ni', $s)['i'];
            // Skip the EXIF info
            fread($f1, $len - 2);
            break;
         else 
            fwrite($f2, $s, 2);
        
    

    // Write the rest of the file
    while (($s = fread($f1, 4096))) 
        fwrite($f2, $s, strlen($s));
    

    fclose($f1);
    fclose($f2);

El código es bastante simple. Abre el archivo de entrada para leer y el archivo de salida para escribir, y luego comienza a leer el archivo de entrada. Da datos de uno a otro. Una vez que alcanza el marcador EXIF, lee la longitud del registro EXIF ​​y salta esa cantidad de bytes. Luego continúa leyendo y escribiendo los datos restantes.

Al final de la artículo puedes encontrar las explicaciones de otros usuarios, tú todavía eres capaz dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *