2009-11-11 36 views
0

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

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

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


在查询这个问题是否已经被问到的过程中,我遇到了一些想法。经过一些试验和错误之后,我可能能够使用glob(),exif_read_data()和imagerotate()将某些东西揉合在一起。我明天再试。但现在我要去睡觉了。

+0

只是一个提示:您的结束语使人们想要将您的问题关闭为“不再相关”,并可能阻止答案,因此您可能希望下次省略。 :) – Ether 2009-11-11 23:53:29

+0

只需使用ImageMagick附带的命令行'convert'实用程序来旋转图像并将其上传到您的站点,而不是编写服务器端解决方案。请注意,提供的两个答案都会在每次访问时旋转图像。如果每次访问图像时都要用旋转的图像替换原始文件,效果会很有趣*。 – 2009-11-12 03:37:32

+0

澄清:感谢您对旋转图像的帮助。但是,我真正需要帮助的是检查图像以确定哪些图像需要旋转。我真的很想要一个服务器端的解决方案,因为我的笔记本电脑花了大部分时间上传所有这些图像,我不喜欢这样做。 显然,图像中有一些标志,告诉F-Spot显示它们旋转。我怎样才能找到那个标志并只旋转图像呢?我将在exif数据中查找它,但函数exif_read_data()的php手册看起来并不乐观。 – TRiG 2009-11-12 09:59:05

回答

2

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

+0

现在,我为什么不考虑寻找“方向”?太精彩了。甚至有一些代码显示在mafo的php手册中,我可以使用它们。 http://php.net/manual/en/function.exif-read-data.php – TRiG 2009-11-16 16:11:59

+1

当你知道答案时,说出问题总是比较容易! – 2009-11-16 19:46:34

+0

我仍然没有工作,但我知道我现在要去哪里。当我有一些实际的工作代码时,我会在这里发布。 – TRiG 2009-11-18 12:21:29

3

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

这里有一个简单的Perl脚本,以顺时针图像旋转(并保留文件的修改时间):这个直接从PHP网站

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; 
} 
+0

你不需要存储所有你不需要的数据位 - 你可以执行'my $ mtime =(stat $ filename)[9]'或者你可以加载'File :: stat'过去12年),并执行'my $ mtime = stat($ filename) - > mtime'。 – hobbs 2009-11-12 01:16:02

+0

同意! (我从10年前编写的脚本中提取出来的,所以它绝对不是完美的,我不得不在它适合发布之前进行大量编辑。例如,我不相信我没有使用'use strict;使用警告;'):D – Ether 2009-11-12 01:20:49

3

复制: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); 
?> 
+0

是的。这将旋转图像。但是,我如何决定旋转哪些图像?我想要一个检查图像标题并检查它是否被F-Spot旋转的函数。如果没有,该功能停止。如果已经存在,该功能会将图像旋转适当的量。 F-Spot(和一些其他程序,包括某些相机)通过添加一个音符来旋转图像,以表示图像已旋转。其他程序忽略该笔记,并且不显示旋转的图像。我想查找包含该音符的图像并正确旋转它们。 – TRiG 2009-11-16 11:00:59