Есть ли способ удалить данные EXIF из JPG с помощью PHP? Я слышал о PEL, но я надеюсь, что есть более простой способ. Я загружаю изображения, которые будут отображаться онлайн, и хотел бы удалить данные EXIF.
Благодаря!
EDIT: я не могу / не могу установить ImageMagick.
Используйте gd
для воссоздания графической части изображения в новой, сохраненной с другим именем .
Просмотреть PHP gd
Используйте новую функцию Imagick.
Открыть изображение:
<?php $incoming_file = '/Users/John/Desktop/file_loco.jpg'; $img = new Imagick(realpath($incoming_file));
Обязательно сохраните профиль ICC на изображении
$profiles = $img->getImageProfiles("icc", true);
затем нарисуйте изображение и верните профиль, если он
$img->stripImage(); if(!empty($profiles)) { $img->profileImage("icc", $profiles['icc']); }
Приходит с этой страницы PHP , см. Комментарий от Max Eremin вниз по странице.
Быстрый способ сделать это на 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 для перезаписи JPEG с удалением всех данных Exif. Мне не нужно было ничего для моих целей.
Этот вариант имеет несколько преимуществ …
Также примечание об использовании imagecreatefromjpeg: я попробовал это, и мои файлы стали больше. Если вы установите качество 100, ваш файл будет LARGER, потому что изображение было повторно сэмплировано, а затем сохранено без потерь. И если вы не используете качество 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); }
Я совершенно неправильно понял ваш вопрос.
Для выполнения этой задачи вы можете использовать инструмент командной строки. или напишите собственное расширение php, чтобы сделать это. взгляните на эту библиотеку, которая была бы полезна: http://www.sno.phy.queensu.ca/~phil/exiftool/
Ура,
VFN
Я не очень уверен в этом, но если его возможно использовать GD
o ImageMagick
, первое, что приходит мне на ум, – создать новое изображение и добавить старое изображение в новое.
это самый простой способ:
$images = glob($location.'/*.jpg'); foreach($images as $image) { $img = imagecreatefromjpeg($image); imagejpeg($img,$image,100); }
Ниже будут удалены все данные EXIF файла jpeg. Это сделает копию исходного файла без EXIF и удалит старый файл. Используйте 100 качество, чтобы не потерять никаких качественных деталей изображения.
$path = "/image.jpg"; $img = imagecreatefromjpeg ($path); imagejpeg ($img, $path, 100); imagedestroy ($img);
(простое приближение к графу можно найти здесь )
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); }
Это прототип вызова из командной строки. Без функции эха работает как часть CMS