Forum Webscript.Ru
Программирование => Perl => Тема начата: AprilBear от 01 Августа 2005, 15:20:48
-
Привет, ALL!
Помогите решить проблемку.
Есть скрипт, который обрабатывает два изображения и в итоге я получаю одно, затем мне надоть его вывести прямо в браузер, не сохраняя на диск. Идея была реализована так ->
print "Content-Type: image/gif\\n\\n";
open(GIF,"<$file") || die "Can\'t open GIF\\n";
my $buffer =0;
while (read(GIF,$buffer,16384))
{
print $buffer;
}
почему-то не работает. Причем на разных изображениях по -разному. Может выдать в окно тонкую полоску мусора от картинки, картинку с кривыми цветами, а может выдать квадрат с красным крестом, как будто картинки не существует. Поможите, кто чем может, а? Можно-ли вообще вывести картинку прямо из скрипта в браузер, и если можно, то как?:|
-
perldoc -f binmode
-
ondr:
perldoc -f binmode
Прочитал, много думал:) и придумал вот что :
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw (fatalsToBrowser);
my $file = \'model.gif\';
print "Content-Type: image/gif\\n\\n";
open(SRC,"<$file") || die "Can\'t open GIF\\n";
my $buffer =0;
binmode(SRC); #!!!!!!!!!!!!
while(my $buffer = ){
print $buffer;
}
и опять не работает. :( Пойду убью себя ап стену.
-
while(){ print }
-
А вообще перенаправь вывад не в STDOUT а в файл и потом сравни файлы. Есть разница?
-
NeoNox:
...файлы. Есть разница?
Разница есть, заключается в + ~200 б. в конечном файле.
Да, кстати, из хтмл вызывается так :
, может здесь трабл? Заголовок, ксати правильный получается (GIF89), и посмотреть картинку можно, т.е. структура формата вроде сохранена, но содержание - полная фигня - те же проблемы. Хотя возможно, что для графики потеря нескольких байтов не критична и поэтому просмотровщик сам определяет проблему и частично её закрывает. В браузер не выводится.
-
пробуй тоже binmode указать:
binmode(STDOUT);
Что за сервер?
# httpd -v
-
NeoNox:
пробуй тоже binmode указать:
binmode(STDOUT);
Что за сервер?
# httpd -v
Попробовал (STDOUT), тоже самое.
Сервер Apache/1.3.31 Server at 127.0.0.1 Port 80
Все кстати под Виндой 2000.
Аналога команды в винде не знаю.
Меня интересует - а вообще, в целом, правильный подход к выводу изображения? Может так вообще нельзя с ним поступать? Хотя, почему нельзя...?
-
Различия начинаются с 0D 0A - в конечном файле, только 0A - в исходном. Дописывает один символ, и в итоге файл получается больше. binmode, как я понял как раз и нужен, для того, чтобы указывать перлу, что не надо добавлять перенос строки, но вот что-то не так. При binmode(SRC, ":raw") - файл равен 23 612, при binmode(SRC, ":crlf") - файл равен 23 611, исходник - 23 433. По-моему не включается binmode. Как его включить или выключить?
Открыть файл для двоичного (binary) режима доступа. В обычном режиме при вводе символы CR LF транслируются в LF, а при выводе LF транслируется в CR LF. > В-общем почему-то не открывает для двоичного.:(
open(SRC,"<$file") || die "Can\'t open GIF\\n";
binmode SRC;
-
вариации на тему:
#!/usr/bin/perl -w
use strict;
-----
binmode STDOUT;
print "content-type: image/jpeg\\n\\n";
open(F, \'<\', \'pervak.jpg\') or die $!;
binmode(F) or die $!;
print while ;
-----
use CGI;
use Stream::Reader;
my $q = CGI->new;
print $q->header( -type => \'image/jpeg\' );
open(F, \'<\', \'pervak.jpg\') or die $!;
binmode(F) or die $!;
my $s = Stream::Reader->new(\\*F);
$s->readsome( -1, { Out => \\*STDOUT } );
-----
use PCGI;
use Stream::Reader;
use IO::File;
my $q = PCGI->new;
$q->header( content_type => \'image/jpeg\' );
$q->sendheader;
my $fh = IO::File->new( \'pervak.jpg\', O_RDONLY|O_BINARY ) or die $!;
my $s = Stream::Reader->new($fh);
$s->readsome( -1, { Out => \\*STDOUT } );
-----
-
Фух!Частично разобрался. След. код точно выводит бинарный файл, а сверху header приписывает.
#!/usr/bin/perl -w
# opengif2.pl
use strict;
my $file = \'model.gif\';
open(G,"<$file") || die "Can\'t open GIF\\n";
binmode G ; #!!!!!
binmode STDOUT ; #!!!!!!!
print ("Content-Type: image/gif\\r\\n\\r\\n");
print ;
close G;
exit;
Теперь я сделал внутри первого вот это -
open(FIL,"+>out.dat") || print "Couldn`t open file out";
binmode(FIL,":raw");
my $k="1234567890 test";
syswrite(FIL,$k,16,0);
close(FIL);
Из консоли все пашет - "like fucking great" , а вот из браузера не хотит. Не запускается скрипт. При прямом обращении (http://localhost/cgi-bin/opengif3.pl) срабатывает создание тест файла. При обращении из страницы не выполняется вообще, даже ошибку не пишет. Может что-то не то с правами?
-
Есть! :super:
Окончательный рабочий вариант.
Для работы с изображениями использовался ImageMagick 6.2.3 q16, использовался ActivePerl 5.8.7 build 813 и Apache 1.3.31.
Читаем изобр.
#####cut here
$model=Image::Magick->new(); # новый проект для основного изображения
$model->Read($url);
#####cut here
Последняя часть кода выводит изобр. в страницу:
#####cut here
#Вывод изображения в страницу
$blob=$model->ImageToBlob(magick=>\'gif\');
binmode STDOUT;
print "Content-type: image/gif\\n";
print "\\n";
print $blob;
exit;
#####cut here
Вызывать можно так 
Всем спасибо!:cool: