TclTk从画布中获取图像

时间:2017-05-07 09:26:16

标签: image canvas tcl tk

我在$gw.sw.sf.frame.c创建了一个画布,其中$gw是顶级窗口swsf是一个ScrollledWindow和一个来自BWidget包的ScrollableFrame,c是画布(tk::canvas)。在画布内部只有文字和矩形填充一些颜色。 我可以使用以下方法从画布生成正确的eps文件:

$can postscript -colormode color -file test.eps

但是,如果我尝试使用::canvas::snap $can来获取图像,然后能够使用Img包保存PNG / BMP / TIFF / JPEG图像文件,则会出现以下错误:

Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?)
Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?)
    while executing
    "image create photo -data $can"
        (procedure "::mTKs::savegraphres" line 3)
        invoked from within
    "::mTKs::savegraphres .graphresults1494146100.sw.sf.frame.c"
        (menu invoke)

所以问题是:

  1. 有没有办法解决这个问题,所以我可以使用:: canvas :: snap然后用Img生成图像文件?

  2. 如果没有,有没有办法只使用TclTk代码将eps文件转换为图像文件?我知道我可以为此目的使用Ghostscript或ImageMagic,但我希望我的程序只使用TclTk。

  3. 从画布中获取图像的任何其他方式??

  4. 以防万一:我使用的是OS 10.12.4 TclTk 8.6 Img 1.4.6 Tklib 0.6和BWidget 1.9.10

    新事实

    我发现问题出在OS X版本上。在我的工作中,我使用的是10.10.4,这里代码能够创建图形,但在创建图形之后,画布内容变为白色。我猜canvas :: snap会改变窗口内的堆叠顺序,从而产生明显的空白画布,这是正确的吗?

    此外,我接受了Donal Fellows的建议并直接在.toplevelwindow.canvas中创建画布,并使用10.10.4 canvas :: snap和Img生成正确的图像,窗口内容不会改变。使用10.12.4我得到了和以前一样的错误。有什么工作吗?

1 个答案:

答案 0 :(得分:0)

您正在使用作为Img包的一部分支持的机制(有时也称为tkimg来区分它)。错误消息是:

Window ".graphresults1494146100.sw.sf.frame.c" cannot be transformed into a pixmap (possibly obscured?)

问题在于,通过对画布进行屏幕抓取(即,它与任何屏幕截图机制使用的完全相同的底层API)来执行画布到图像的转换,这似乎具有失败。失败的最可能原因是在捕获完成时画布没有显示在屏幕上;它需要在屏幕上最顶层才能使捕获工作。

要使画布在屏幕上显示,需要由自身映射的顶层内的几何管理器进行适当管理。然后需要将其升高到窗户堆叠的顶部,包括在顶部和顶部相对于屏幕内容的其余部分。通常你可以这样做:

pack $thecanvas;   # Or “grid $thecanvas” or any of a number of other alternatives
update
raise $thecanvas
raise -force [winfo toplevel $thecanvas]
update
# Do the capture here

但是,在您的情况下,它位于一个复杂的小部件堆栈中,因此这些可能是个问题。 (例如,他们可能会迫使画布在屏幕外或类似的东西上进行映射。各种复杂性都是可能的!)如果是这样的话,在另一个画布中生成内容(只需要一会儿)可能是一种解决方法。我不知道画布是否需要在屏幕上看到,但我怀疑它确实如此。

一般情况下,如果你真的做了很多像这样的转换,最好将封装的postscript直接转换为图片,而不是通过屏幕截图(因为总是有点不稳定和不确定)。这样做的常用工具是Ghostscript,通常包含在ImageMagick套件中,因为它可以完成这些转换而无需访问用户的屏幕。