【问题标题】:Image corruption using LWP::UserAgent使用 LWP::UserAgent 损坏图像
【发布时间】:2012-12-30 18:13:02
【问题描述】:

以下脚本循环运行,使用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");  

【问题讨论】:

    标签: perl imagemagick lwp lwp-useragent


    【解决方案1】:

    从不使用

    $response->content()
    

    你想要

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

    【讨论】:

    • 我同意。但我认为你应该解释你的答案
    • @Borodin,“因为这就是你想要的回报”
    • 已更改为 decoded_content 作为答案,但仍然没有好处。我打印了 content_type 以验证我得到的是图像/jpeg。我猜这一定与网站呈现图像的方式有关,但是如果我直接使用 chrome 下载到我的计算机并上传到服务器,一切都很好。我以前可以使用不同的 URL 结构从该站点镜像图像。不知道我还能做什么。我可以从服务器上提取图像,但无法读取以调整大小。
    • 我相信你更清楚。这样的答案可以与“它不起作用”的问题相提并论
    • @chrisrth:您是否使用二进制编辑器查看过保存的图像文件?这将有助于了解文件的错误版本中存在什么样的差异。您可能会得到 HTML,这很明显,但至少 FourCC 应该是正确的。很可能请求的Referer 标头需要正确,服务器才能发送您需要的内容。
    【解决方案2】:

    您可能会得到压缩或其他编码的结果;尝试 ->decoded_content 而不是 ->content。

    来自HTTP::Response 文档:

    $r->内容($bytes)

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

    $r->decoded_content(%options)

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

    【讨论】:

      【解决方案3】:

      此时我知道这很老了,但我也遇到了这个问题,实际上我在使用它之前将图像保存到磁盘,在这样做的同时,我需要设置我正在流式传输的文件句柄/写入“binmode”。

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

      【讨论】:

        猜你喜欢
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        相关资源
        最近更新 更多