web-dev-qa-db-ja.com

PHPを使用してJPGからEXIFデータを削除します

PHPを使用してJPGからEXIFデータを削除する方法はありますか? PELについて聞いたことがありますが、もっと簡単な方法があるといいのですが。オンラインで表示される画像をアップロードしていますが、EXIFデータを削除してください。

ありがとう!

編集:私はImageMagickをインストールできません/インストールできません。

20
tau

PHPでImageMagickを使用してそれを実行する高速な方法(インストールして有効にしている場合)。

<?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

私もこれに対する解決策を探していました。最後に、PHP=を使用して、すべてのExifデータが削除されたJPEGを書き換えました。私は、目的のためにそれを必要としませんでした。

このオプションにはいくつかの利点があります...

  • EXIFデータがなくなっているため、ファイルは小さくなります。
  • 画質の低下はありません(画像データが変更されていないため)。

また、imagecreatefromjpegの使用に関する注意:これを試したところ、ファイルが大きくなりました。品質を100に設定すると、画像がリサンプリングされてからロスレスで保存されるため、ファイルは大きくなります。また、品質100を使用しないと、画質が低下します。リサンプリングを回避する唯一の方法は、imagecreatefromjpegを使用しないことです。

これが私の機能です...

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

これが最も簡単な方法です。

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

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

以下は、jpegファイルのすべてのEXIFデータを削除します。これにより、EXIFなしで元のファイルのコピーが作成され、古いファイルが削除されます。画像の品質の詳細を失わないように100品質を使用します。

$path = "/image.jpg";

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

(グラフへの簡単な近似が見つかります here

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);
}

コマンドラインからの呼び出しのプロトタイプです。

3
Dmitry Bugrov

私はあなたの質問を完全に誤解しました。

コマンドラインツールを使用してこの作業を行うことができます。それを行うには、独自のphp拡張機能を記述します。便利なこのlibを見てください: http://www.sno.phy.queensu.ca/~phil/exiftool/

乾杯、

vfn

2
vfn

よくわかりませんが、可能であれば Gd o ImageMagick を使用して、最初に思い浮かぶ新しい画像を作成し、古い画像を新しい画像に追加します。

1
Garis M Suero