如何将图像作为Web服务处理?

时间:2012-08-17 18:59:19

标签: web-services cgi

我想编写一个简单的Web服务(我不是特别关于语言实现),它在nearfreespeech.net上的FreeBSD Web服务器上运行,获取一个指向带有一些附加参数的JPEG图像的URL,如下所示:

http://www.myserver.com/script.cgi?url=http://www.destination.com/image.jpg&width=320

并执行以下操作:

  1. 如何解析网址的参数? (目标网址加上一些其他参数供处理)
  2. 如何在参数?
  3. 中提供的URL处获取图像的内容
  4. 根据其他参数,对内容执行一些处理(超出此问题的范围)
  5. 如何将已处理的图像返回以正确识别为要在浏览器中显示的图像(而不是返回文本)?
  6. 我认为使用像Perl这样的脚本语言并不困难,但我不知道从哪里开始步骤1,2和4。

5 个答案:

答案 0 :(得分:1)

您提供的网址无效,但您可以对查询字符串进行编码,例如: http://www.myimageserver.com?url=http%3a%2f%2fwww.flickr.com%2fsomeimage.jpg%2f320%2f200(这里的flickr网址是urlencoded,你可以在网上尝试urlencoding:http://www.opinionatedgeek.com/DotNet/Tools/UrlEncode/Encode.aspx

  1. 使用php,您可以获取网址的参数。要在php中访问“http://www.flickr.com/someimage.jpg/320/200”,您只需使用:

    $ url = $ _GET ['url']; //将$ url设置为字符串:“http://www.flickr.com ...”

    // ...解析可以在这里完成

  2. 获取网址的内容:

    $ url_content = file_get_contents($ url);

  3. 现在您可以进行处理了。

  4. 要返回输出,可以使用echo:

    echo $ processed_content;

答案 1 :(得分:1)

我最近一直在研究一个PHP scraper,所以我对其中一些问题已经相当熟悉。

我建议针对这些问题采用以下解决方案:

  1. 您可以使用$ _GET或$ _POST轻松获取参数。如果您需要获取URL的其他部分,可以使用parse_url()

  2. 虽然file_get_contents()可以使用,但cURL是一个更加复杂和强大的解决方案。

  3. cURL可以返回包含已下载文件的文件句柄,并且可以在此处进行处理。

  4. 然后您可以使用fwrite()将文件内容写入本地文件

答案 2 :(得分:0)

这是一个例子,仅适用于jpeg图像。

<?
$url = $_GET['url'];

$im = imagecreatefromjpeg($url);
header("Content-Type: image/jpeg");

for($i=0;$i<100;$i++)
{
    for($j=0;$j<100;$j++)
    {
        if(rand(0,1))
        {
            $rand = rand(0,4);
            imagesetpixel($im,$i,$j,imagecolorallocate($im, 255, 255, 255));
        }
    }
}

imagejpeg($im);
?>

答案 3 :(得分:0)

我喜欢python这种事情。具体来说,位于WSGI服务器上的Python WSGI应用程序应该适用于您的应用程序。

Python附带一个“简单服务器”,您可以在其上进行测试。对于部署,您可能希望找到第三方WSGI服务器,如CherryPy的WSGI服务器或Rocket(两者都完全在python中实现)。

如果可能的话,我会推荐python 3.2,因为GIL要好得多,这会对我提到的多线程WSGI服务器产生影响 - CherryPy和Rocket。

阅读WSGI以获取更多信息。在Python坐下 e,PEP 333和3333。

答案 4 :(得分:0)

以下是我在Perl中的表现:

#!/usr/bin/perl
use CGI qw(:standard);
use IO::Handle;
use LWP::Simple;
use File::Temp;
use File::Slurp;

$url = param('url');
$width = param('width');
$height = param('height');
$content = get($url);

$in = File::Temp->new( SUFFIX => '.jpg' );
print $in $content;

$out = File::Temp->new( SUFFIX => '.jpg' );
system("convert $in -resize $width" . "x" . "$height $out");

my $q = new CGI;
print $q->header( - type => "image/jpeg", -expires => "-1d" );

$content2 = read_file($out);
print $content2;