Intereting Posts
ORDER BY random () с семенем в SQLITE Как заменить все пробелы внутри элементов HTML на & nbsp; используя preg_replace? получение HTTP-ответа POST-ответа из файла PHP (отправка POSTS работает нормально, это получение, которое я не могу понять) Как создать вложенный список из массива PHP для выпадающего списка? python формат datetime с "st", "nd", "rd", "th" (английский порядковый суффикс), как PHP "S" TCPDF ERROR: Не удалось получить изображение Могу ли я запускать php-скрипт под разрешениями пользователя с помощью FastCGI и APACHE? Ajax PHP Созданная форма не отправляется CURL HTTP / 1.1 403 Запретная дата PHP DOM: Как получить дочерние элементы по имени тега элегантным способом? Scrap Amazon все сделки php curl? Как получить значение специальных атрибутов / пользовательских атрибутов HTML с помощью PHP DOM Parser? создать рекурсивное меню навигации php DNS не работает в PHP (но в целом) WordPress: как добавить запятые в эту функцию get_the_category

Удалить данные EXIF ​​из JPG с помощью PHP

Есть ли способ удалить данные EXIF ​​из JPG с помощью PHP? Я слышал о PEL, но я надеюсь, что есть более простой способ. Я загружаю изображения, которые будут отображаться онлайн, и хотел бы удалить данные EXIF.

Благодаря!

EDIT: я не могу / не могу установить ImageMagick.

Используйте gd для воссоздания графической части изображения в новой, сохраненной с другим именем .

Просмотреть PHP gd


изменить 2017

Используйте новую функцию 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. Мне не нужно было ничего для моих целей.

Этот вариант имеет несколько преимуществ …

  • Файл меньше, потому что данные 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