Используйте PHP или Perl для правильного поворота изображений в формате JPEG
Вопрос
Я использовал F-Spot в Ubuntu, чтобы повернуть некоторые фотографии (файлы JPEG), прежде чем загрузить их на свой веб-сайт.Казалось, это сработало просто отлично.Однако, если эти изображения открыты в веб-браузере, они не отображаются повернутыми.Они также не работают, если я загружаю их на компьютер с Windows Vista и открываю там с помощью любой стандартной программы.Я подозреваю, что F-Spot вращает изображения путем изменения данных exif или чего-то подобного, а не путем фактического поворота изображений.
Итак, я хочу небольшую функцию, которая будет запускаться на моем веб-сервере (т. Е. PHP или Perl), которая будет принимать массив путей к файлам, проверять изображения и поворачивать те, которые необходимо повернуть, перезаписывая исходный файл.
Я немного знаю PHP, но не Perl.
В ходе поиска, чтобы узнать, задавался ли уже этот вопрос, я наткнулся на несколько идей.Возможно, я смогу, после некоторых проб и ошибок, собрать что-нибудь вместе, используя glob(), exif_read_data() и imagerotate().Я попробую завтра.Но сейчас я иду спать.
Решение
В Perl, я думаю, вы хотите "ориентация на exiftool".Эквивалент PHP, по-видимому, доступен через "exif_read_data" - "exif_read_data".
Другие советы
Копирую это непосредственно с веб-сайта PHP: http://us.php.net/manual/en/function.imagerotate.php
В этом примере изображение поворачивается на 180 градусов - вверх ногами.
<?php
// File and rotation
$filename = 'test.jpg';
$degrees = 180;
// Content type
header('Content-type: image/jpeg');
// Load
$source = imagecreatefromjpeg($filename);
// Rotate
$rotate = imagerotate($source, $degrees, 0);
// Output
imagejpeg($rotate);
?>
Чтобы вывести файл с новым именем файла, используя предыдущий пример:
// Output
imagejpeg($rotate, "new-" . $filename);
?>
В Perl вы можете поворачивать изображения с помощью Изображение:: Магия модуль.Там есть Интерфейс PHP тоже и интерфейс командной строки (я думаю).Если вы просто поворачиваете несколько изображений, вам, вероятно, лучше всего использовать версию командной строки.
Вот простой Perl-скрипт для поворота изображений по часовой стрелке (и сохранения времени изменения файлов).:
use strict;
use warnings;
use Image::Magick;
die "no filename specified!\n" if not @ARGV;
foreach my $filename (@ARGV)
{
print "Processing: $filename\n";
# Get the file's last modified time for restoring later
my $mtime = (stat $filename)[9];
my $image = Image::Magick->new;
my $result = $image->Read($filename);
warn "$result" if $result;
$result = $image->Rotate(degrees => 90.0);
warn "$result" if $result;
$result = $image->Write($filename);
warn "$result" if $result;
# Restore the mtime
utime time, $mtime, $filename;
}