使用PHP或Perl正确旋转JPEG图像

时间:2009-11-11 23:37:52

标签: php perl jpeg rotation exif

我在Ubuntu上使用F-Spot旋转一些照片(JPEG文件),然后将它们FTP到我的网站。这似乎工作得很好。但是,如果这些图像是在Web浏览器中打开的,则它们不会显示为已旋转。如果我将它们下载到Windows Vista计算机并使用任何标准程序打开它们也不会。我怀疑F-Spot通过修改exif数据等来旋转图像,而不是实际旋转图像。

所以我想要一个能在我的网络服务器上运行的小功能(即PHP或Perl),它将接受一组文件路径,检查图像,并旋转那些需要旋转的文件,覆盖原始文件。

我知道一些PHP,但没有Perl。


在搜索是否已经问过这个问题的过程中,我发现了一些想法。在经过一些试验和错误之后,我可以使用glob(),exif_read_data()和imagerotate()将某些内容组合在一起。我明天再试。但现在我要睡觉了。

3 个答案:

答案 0 :(得分:3)

在Perl中,您可以使用Image::Magick模块旋转图像。还有PHP interface和命令行界面(我认为)。如果您只是旋转几张图像,那么最好使用命令行版本。

这是一个简单的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;
}

答案 1 :(得分:3)

直接从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);
?>

答案 2 :(得分:2)

在Perl中,我认为你想要"exiftool -Orientation"。 PHP等价似乎可以通过"exif_read_data"访问。