ti-enxame.com

Remova os dados EXIF ​​do JPG usando PHP

Existe alguma maneira de remover os dados EXIF ​​de um JPG usando PHP? Já ouvi falar da PEL, mas espero que exista uma maneira mais simples. Estou carregando imagens que serão exibidas on-line e que os dados EXIF ​​serão removidos.

Obrigado!

EDIT: Eu não/não consigo instalar o ImageMagick.

20
tau

Uma maneira rápida de fazer isso PHP usando o ImageMagick (Supondo que você o tenha instalado e ativado)).

<?php

$images = glob('*.jpg');

foreach($images as $image) 
{   
    try
    {   
        $img = new Imagick($image);
        $img->stripImage();
        $img->writeImage($image);
        $img->clear();
        $img->destroy();

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

    } catch(Exception $e) {
        echo 'Exception caught: ',  $e->getMessage(), "\n";
    }   
}
?>
16
Bill H

Eu estava procurando uma solução para isso também. No final, usei PHP para reescrever o JPEG com todos os dados ALL Exif removidos. Não precisava de nada disso para meus fins.

Esta opção tem várias vantagens ...

  • O arquivo é menor porque os dados EXIF ​​sumiram.
  • Não há perda de qualidade da imagem (porque os dados da imagem permanecem inalterados).

Também uma observação sobre o uso do imagecreatefjreg: tentei isso e meus arquivos ficaram maiores. Se você definir a qualidade como 100, seu arquivo será MAIOR, porque a imagem foi reamostrada e armazenada de maneira sem perdas. E se você não usa a qualidade 100, perde a qualidade da imagem. A única maneira de evitar a reamostragem é não usar o imagecreatefjjeg.

Aqui está a minha função ...

function removeExif($old, $new)
{
    $f1 = fopen($old, 'rb');
    $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);
}
5
xtempore

esta é a maneira mais simples:

$images = glob($location.'/*.jpg');

foreach($images as $image) {   
    $img = imagecreatefromjpeg($image);
    imagejpeg($img,$image,100);
}
4
semaca2005

A seguir, todos os dados EXIF ​​de um arquivo jpeg serão removidos. Isso fará uma cópia do arquivo original sem EXIF ​​e removerá o arquivo antigo. Use 100 de qualidade para não perder nenhum detalhe de qualidade na imagem.

$path = "/image.jpg";

$img = imagecreatefromjpeg ($path);
imagejpeg ($img, $path, 100);
imagedestroy ($img);

(pode ser encontrada uma aproximação simples ao gráfico aqui )

4
Naveen Web Solutions
function remove_exif($in, $out)
{
    $buffer_len = 4096;
    $fd_in = fopen($in, 'rb');
    $fd_out = fopen($out, 'wb');
    while (($buffer = fread($fd_in, $buffer_len)))
    {
        //  \xFF\xE1\xHH\xLLExif\x00\x00 - Exif 
        //  \xFF\xE1\xHH\xLLhttp://      - XMP
        //  \xFF\xE2\xHH\xLLICC_PROFILE  - ICC
        //  \xFF\xED\xHH\xLLPhotoshop    - PH
        while (preg_match('/\xFF[\xE1\xE2\xED\xEE](.)(.)(exif|photoshop|http:|icc_profile|Adobe)/si', $buffer, $match, PREG_OFFSET_CAPTURE))
        {
            echo "found: '{$match[3][0]}' marker\n";
            $len = ord($match[1][0]) * 256 + ord($match[2][0]);
            echo "length: {$len} bytes\n";
            echo "write: {$match[0][1]} bytes to output file\n";
            fwrite($fd_out, substr($buffer, 0, $match[0][1]));
            $filepos = $match[0][1] + 2 + $len - strlen($buffer);
            fseek($fd_in, $filepos, SEEK_CUR);
            echo "seek to: ".ftell($fd_in)."\n";
            $buffer = fread($fd_in, $buffer_len);
        }
        echo "write: ".strlen($buffer)." bytes to output file\n";
        fwrite($fd_out, $buffer, strlen($buffer));
    }
    fclose($fd_out);
    fclose($fd_in);
}

É um protótipo para uma chamada de uma linha de comando.

3
Dmitry Bugrov

Eu entendi completamente sua pergunta.

Você pode usar alguma ferramenta de linha de comando para fazer esse trabalho. ou escreva sua própria extensão php para fazer isso. dê uma olhada nesta biblioteca que seria útil: http://www.sno.phy.queensu.ca/~phil/exiftool/

Felicidades,

vfn

2
vfn

Não tenho muita certeza, mas se é possível usar Gd o ImageMagick , a primeira coisa que me vem à cabeça é criar uma nova imagem e adicionar a imagem antiga à nova.

1
Garis M Suero