perl,tk如何将此图像保存到文件中?

时间:2012-01-09 18:24:38

标签: perl tk

我正在学习tk并尝试调试我的脚本。我不确定我缺少什么来将我的图像保存到文件中。谢谢你的帮助

#!/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 :(得分:0)

我的猜测是“转换”(在反引号中)由于某种原因(例如不在路径中)失败。您需要检查是否成功。有更安全的方法可以在perl中生成子进程,例如使用“系统”调用。


根据戈登在下面的评论,我想改变我的回答:

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

  

注意:默认情况下,仅为屏幕上画布窗口中显示的信息生成Postscript。如果画布是新创建的,它的初始大小可能仍为1x1像素,因此Postscript中不会显示任何内容。要解决此问题,请调用“update”命令以等待画布窗口达到其最终大小,或者使用-width和-height选项指定要打印的画布区域。 option-value参数对提供了控制Postscript生成的附加信息。

答案 1 :(得分:0)

当画布生成postscript时,默认情况下它会尝试对屏幕的可见部分执行此操作;此信息在生成的postscript文件上设置为边界框声明。如果您从未映射过画布(使用包或网格,然后处理事件一段时间),那么它设置为边界框的区域将是假的;数据将存在于文件中,但是当渲染到屏幕或图像时,实际上只会使用其中的一小部分。

对此的修复(根据上面的工作流程)是明确说明边界框。

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

完成后,您实际上并不需要指定主窗口的任何内容(逻辑上存在的除外)。您也可以删除画布的光标规范;在PS生成期间不会使用。