PHPを使用してJPGからEXIFデータを削除する方法はありますか? PELについて聞いたことがありますが、もっと簡単な方法があるといいのですが。オンラインで表示される画像をアップロードしていますが、EXIFデータを削除してください。
ありがとう!
編集:私はImageMagickをインストールできません/インストールできません。
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";
}
}
?>
私もこれに対する解決策を探していました。最後に、PHP=を使用して、すべてのExifデータが削除されたJPEGを書き換えました。私は、目的のためにそれを必要としませんでした。
このオプションにはいくつかの利点があります...
また、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);
}
これが最も簡単な方法です。
$images = glob($location.'/*.jpg');
foreach($images as $image) {
$img = imagecreatefromjpeg($image);
imagejpeg($img,$image,100);
}
以下は、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);
}
コマンドラインからの呼び出しのプロトタイプです。
私はあなたの質問を完全に誤解しました。
コマンドラインツールを使用してこの作業を行うことができます。それを行うには、独自のphp拡張機能を記述します。便利なこのlibを見てください: http://www.sno.phy.queensu.ca/~phil/exiftool/
乾杯、
vfn
よくわかりませんが、可能であれば Gd
o ImageMagick
を使用して、最初に思い浮かぶ新しい画像を作成し、古い画像を新しい画像に追加します。