2012-12-30 46 views
2

以下腳本在循環中運行,使用LWP::UserAgent檢索圖像,並使用Image::Magick調整它們的大小。使用LWP :: UserAgent的圖像損壞

我從Image::Magick讀取下載的圖像時收到此錯誤:

Exception 450: Unsupported marker type 0x54 

如果我的LWP下載的圖像下載到我的電腦,在照片編輯器中打開它,保存爲.jpg文件,上傳並嘗試用Image::Magick閱讀,然後一切正常。這會導致我相信圖像沒有正確保存。

我需要使用LWP::UserAgent,因爲我連接的服務器將不允許下載,除非它認爲客戶端正在請求數據。

use LWP::UserAgent; 
use Image::Magick; 

$ua = new LWP::UserAgent; 
$ua->agent("$0/0.1 " . $ua->agent); 
$ua->agent("Mozilla/8.0"); 

my $PICURL ="http://www.example.com/img.aspx?pid=cjfsaf79afffafhfah777af7"; 
my $PICDEST ="/var/vhosts/mysite.com/httpdocs/images"; 
my $PICNAME ="01.jpg"; 

my $response = $ua->get("$PICURL"); 

open(outfile, ">:raw", "$PICDEST/$PICNAME"); 
binmode outfile; 

if ($response->is_success) { 
    print outfile $response->content; 
    $Pi++; 
    $PTOT++; 
} 
else { 
    die $response->status_line; 
} 

$image = new Image::Magick; 
$image->Read("$PICDEST/$PICNAME"); 
$image->Scale(width=>800, height=>600); 
$image->Write("$PICDEST/$PICNAME"); 
$image->Scale(width=>216, height=>163); 
$image->Set(quality=>90); 
$image->Write("$PICDEST/TH_$PICNAME"); 

回答

2

您可能正在獲取壓縮或其他編碼結果;嘗試 - > decode_content而不是 - >內容。

HTTP::Response DOC:

$ R->內容($字節)

這用於獲取/設置的原始內容和它從HTTP ::消息基類繼承。有關可用於訪問內容的詳細信息和其他方法,請參閱HTTP :: Message。

$ R-> decoded_content(%選擇)

這將返回任何內容編碼字符集和之後的內容已經被解碼。有關詳細信息,請參閱HTTP :: Message。

4

切勿使用

$response->content() 

你想

$response->decoded_content(charset => 'none') 
+0

我同意。但我認爲你應該解釋你的答案 – Borodin

+0

@Borodin,「因爲這是什麼返回你想要的」 – ikegami

+0

改爲decode_content在答案,但仍然沒有好處。我打印了content_type以確認我獲得了image/jpeg。我猜這必須與網站呈現圖像的方式有關,但如果我直接用chrome下載到我的電腦並上傳到服務器,一切都很好。我已經能夠使用不同的URL結構來鏡像來自此網站的圖像。不知道我還能做什麼。我可以從服務器上拉取圖像,但無法讀取調整大小。 – chrisrth

0

我知道這很老的在這一點上,但我只是碰到了這個問題,以及和我的形象實際上是保存到在使用它之前,我需要將正在流/寫入的文件句柄設置爲'binmode'。

open $fh.... 
binmode($fh) 
print $fh ..... 
close $fh