2012-01-09 84 views
1

我正在學習tk並嘗試調試我的腳本。我不知道我錯過了什麼將圖像保存到文件中。感謝您的任何幫助perl,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; 
+0

當你運行上面的代碼時會發生什麼?有沒有錯誤信息?有意想不到的輸出嗎? – 2012-01-09 18:27:06

+0

它創建文件file_Name.ps和file_name.jpeg,當我查看file_name.jpeg,它什麼也沒有顯示... – Gordon 2012-01-09 18:27:33

+0

在反引號中的轉換試圖產生一個新的進程,並且你不檢查是否成功。 – theglauber 2012-01-09 18:28:11

回答

0

我的猜測是「轉換」(在反引號)由於某種原因失敗(例如不在路徑中)。你需要檢查是否成功。有更安全的方式在perl中產生一個子進程,例如使用「系統」調用。


基於以下戈登的評論,我想改變我的回答:

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

注:默認情況下後記僅提供信息生成出現在畫布上的窗口在屏幕上。如果畫布是新創建的,它可能仍然具有1x1像素的初始大小,因此Postscript中不會顯示任何內容。要解決此問題,請調用「update」命令以等待畫布窗口達到其最終大小,否則使用-width和-height選項指定要打印的畫布區域。選項 - 值參數對提供了控制Postscript生成的附加信息。

+0

反正我拿出了轉換,即使是ps文件顯示一個空白.. – Gordon 2012-01-09 18:30:43

0

當畫布生成postscript時,它會默認爲屏幕的可見部分嘗試這樣做;此信息在生成的postscript文件中設置爲邊界框聲明。如果您從未映射過畫布(包或網格,然後處理事件一段時間),則設置爲邊界框的區域將爲假;數據將會出現在文件中,但是當渲染到屏幕或圖像時,實際上只會使用它的一小部分。

對此的修復(給定您的工作流程)是明確指定邊界框。

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

一旦你做到了這一點,你實際上並不需要指定有關主窗口任何東西(除了它在邏輯上存在的除外)。您也可以刪除畫布的光標指定;這在PS生成期間不會被使用。