2009-11-11 37 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