Используйте PHP или Perl для правильного вращения изображений JPEG - PullRequest
0 голосов
/ 12 ноября 2009

Я использовал F-Spot в Ubuntu, чтобы вращать некоторые фотографии (файлы JPEG), прежде чем отправлять их по FTP на свой веб-сайт. Казалось, это работает просто отлично. Однако если эти изображения открываются в веб-браузере, они не отображаются как повернутые. И они тоже, если я скачаю их на компьютер с Windows Vista и открою там с помощью любой стандартной программы. Я подозреваю, что F-Spot вращает изображения, изменяя данные exif или аналогичные, а не фактически поворачивая изображения.

Итак, мне нужна небольшая функция, которая будет работать на моем веб-сервере (например, PHP или Perl), которая будет принимать массив путей к файлам, проверять изображения и поворачивать те, которые необходимо повернуть, переписывая исходный файл.

Я знаю немного PHP, но нет Perl.


В процессе поиска, чтобы узнать, был ли уже задан этот вопрос, я натолкнулся на некоторые идеи. После некоторых проб и ошибок я мог бы собрать что-то вместе, используя glob (), exif_read_data () и imagerotate (). Я попробую завтра. Но теперь я иду спать.

Ответы [ 3 ]

3 голосов
/ 12 ноября 2009

Копирование этого непосредственно с сайта 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);
?>
3 голосов
/ 12 ноября 2009

В Perl вы можете вращать изображения, используя модуль Image :: Magick . Есть также интерфейс 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;
}
2 голосов
/ 16 ноября 2009

В Perl, я думаю, вы хотите "exiftool -Orientation" . PHP-эквивалент, по-видимому, доступен через "exif_read_data" .

...