Автор Тема: Вывод изображения  (Прочитано 5782 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AprilBear

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вывод изображения
« : 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;
 }
почему-то не работает. Причем на разных изображениях по -разному. Может выдать в окно тонкую полоску мусора от картинки, картинку с кривыми цветами, а может выдать квадрат с красным крестом, как будто картинки не существует. Поможите, кто чем может, а? Можно-ли вообще вывести картинку прямо из скрипта в браузер, и если можно, то как?:|

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Вывод изображения
« Ответ #1 : 01 Августа 2005, 15:52:22 »
perldoc -f binmode
0 OK, 0:1

Оффлайн AprilBear

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вывод изображения
« Ответ #2 : 01 Августа 2005, 16:42:05 »
Цитировать
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;
  }

и опять не работает. :( Пойду убью себя ап стену.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Вывод изображения
« Ответ #3 : 01 Августа 2005, 17:07:00 »
while(){ print }
The documentations is your friend

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Вывод изображения
« Ответ #4 : 01 Августа 2005, 17:14:17 »
А вообще перенаправь вывад не в STDOUT а в файл и потом сравни файлы. Есть разница?
The documentations is your friend

Оффлайн AprilBear

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вывод изображения
« Ответ #5 : 01 Августа 2005, 17:52:07 »
Цитировать
NeoNox:
...файлы. Есть разница?

Разница есть, заключается в + ~200 б. в конечном файле.
Да, кстати, из хтмл вызывается так : , может здесь трабл? Заголовок, ксати правильный получается (GIF89), и посмотреть картинку можно, т.е. структура формата вроде сохранена, но содержание - полная фигня - те же проблемы. Хотя возможно, что для графики потеря нескольких байтов не критична и поэтому просмотровщик сам определяет проблему и частично её закрывает. В браузер не выводится.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Вывод изображения
« Ответ #6 : 01 Августа 2005, 18:05:30 »
пробуй тоже binmode указать:
binmode(STDOUT);
Что за сервер?
# httpd -v
The documentations is your friend

Оффлайн AprilBear

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вывод изображения
« Ответ #7 : 01 Августа 2005, 18:23:45 »
Цитировать
NeoNox:
пробуй тоже binmode указать:
binmode(STDOUT);
Что за сервер?
# httpd -v

Попробовал (STDOUT), тоже самое.
Сервер Apache/1.3.31 Server at 127.0.0.1 Port 80
Все кстати под Виндой 2000.
Аналога команды в винде не знаю.
Меня интересует - а вообще, в целом, правильный подход к выводу изображения? Может так вообще нельзя с ним поступать? Хотя, почему нельзя...?

Оффлайн AprilBear

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вывод изображения
« Ответ #8 : 02 Августа 2005, 11:10:27 »
Различия начинаются с 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;

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Вывод изображения
« Ответ #9 : 02 Августа 2005, 11:53:54 »
вариации на тему:



#!/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 } );

-----

0 OK, 0:1

Оффлайн AprilBear

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вывод изображения
« Ответ #10 : 02 Августа 2005, 14:12:15 »
Фух!Частично разобрался. След. код точно выводит бинарный файл, а сверху 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) срабатывает создание тест файла. При обращении из страницы не выполняется вообще, даже ошибку не пишет. Может что-то не то с правами?

Оффлайн AprilBear

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вывод изображения
« Ответ #11 : 05 Августа 2005, 09:43:45 »
Есть! :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:

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28