Perl, тк, как сохранить это изображение в файл? - PullRequest
1 голос
/ 09 января 2012

Я изучаю тк и пытаюсь отладить свой скрипт. Я не уверен, что мне не хватает, чтобы сохранить мое изображение в файл. Спасибо за любую помощь

#!/tool/pandora64/bin/perl5.8.8.a

use Tk;

my ( $size, $step ) = ( 200, 10 );

# Create MainWindow and configure:
my $mw = MainWindow->new;
$mw->configure( -width=>$size, -height=>$size );
$mw->resizable( 0, 0 ); # not resizable in any direction

# Create and configure the canvas:
my $canvas = $mw->Canvas( -cursor=>"crosshair", -background=>"white",
              -width=>$size, -height=>$size )->pack;

# Place objects on canvas:
$canvas->createRectangle( $step, $step, $size-$step, $size-$step, -fill=>"red" );

for( my $i=$step; $i<$size-$step; $i+=$step ) {
  my $val = 255*$i/$size;
  my $color = sprintf( "#%02x%02x%02x", $val, $val, $val );
  $canvas->createRectangle( $i, $i, $i+$step, $i+$step, -fill=>$color );
}

$canvas->postscript( -file=>"file_name.ps" );

`convert file_name.ps file_name.jpeg`; # I can move this outside out of the script

exit 0;

Ответы [ 2 ]

0 голосов
/ 10 января 2012

Когда холст генерирует постскриптум, он пытается сделать это для видимой части экрана по умолчанию; эта информация устанавливается в сгенерированном файле postscript как объявление ограничивающего прямоугольника. Если вы никогда не отображали холст (с пакетом или сеткой, сопровождаемой обработкой событий некоторое время), область, которую он устанавливает в качестве ограничивающего прямоугольника, будет поддельной; данные будут находиться в файле, но при отображении на экране или изображении будет использоваться только крошечная часть.

Исправление для этого (учитывая ваш рабочий процесс выше) заключается в явном указании ограничивающей рамки.

$canvas->postscript( -file=>"file_name.ps", -width=>$size, -height=>$size );

Как только вы это сделаете, вам на самом деле не нужно ничего указывать в главном окне (кроме того, что оно логически существует). Вы также можете удалить спецификацию курсора для холста; это не будет использоваться во время генерации PS.

0 голосов
/ 09 января 2012

Я предполагаю, что "convert" (в обратных галочках) по какой-то причине потерпел неудачу (например, не в пути).Вы должны проверить, удалось ли это.Есть более безопасные способы порождения подпроцесса в perl, например, с помощью «системного» вызова.


Основываясь на комментариях Гордона ниже, я хочу изменить свой ответ:

http://www.tcl.tk/man/tcl8.4/TkCmd/canvas.htm#M60

Примечание: по умолчанию Postscript генерируется только для информации, которая появляется в окне холста на экране.Если холст только что создан, он все еще может иметь свой первоначальный размер 1x1 пикселя, поэтому в Postscript ничего не появится.Чтобы обойти эту проблему, либо вызовите команду «update», чтобы дождаться достижения окончательного размера окна холста, либо используйте параметры -width и -height, чтобы указать область холста для печати.Пары аргумента параметр-значение предоставляют дополнительную информацию для управления генерацией Postscript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...