使用LWP :: UserAgent破坏图像

时间:2012-12-30 18:13:03

标签: perl imagemagick lwp lwp-useragent

以下脚本循环运行,使用LWP::UserAgent检索图像,并使用Image::Magick调整图像大小。

我在阅读下载的图片时从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");  

3 个答案:

答案 0 :(得分:4)

永远不要使用

$response->content()

你想要

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

答案 1 :(得分:2)

您可能正在获得压缩或编码结果;尝试 - > decoding_content而不是 - >内容。

来自HTTP::Response doc:

  

$ r->内容($ bytes)

     

这用于获取/设置原始内容,它继承自HTTP :: Message基类。有关可用于访问内容的详细信息和其他方法,请参阅HTTP :: Message。

     

$ r-> decoding_content(%options)

     

这将在解码任何Content-Encoding和字符集后返回内容。有关详细信息,请参阅HTTP :: Message。

答案 2 :(得分:0)

我知道这个现在已经很老了,但我也遇到了这个问题,我实际上是在将图像保存到磁盘之前使用它并且在执行此操作时,我需要设置我正在流式传输的文件句柄/写入'binmode'。

String.Join