如何使用ltk显示图像?
时间:2020-03-05 18:57:23 来源:igfitidea点击:
我已经编写了读取Windows位图的代码,现在想用ltk显示它。如何构造适当的对象? ltk中有这种功能吗?如果没有,我如何直接与tk连接?
解决方案
回答
Tk本机不支持Windows位图文件。但是," Img"扩展确实可以在几乎每个平台上免费使用。我们不需要读取数据,可以直接从磁盘上的文件创建映像。在简单的tcl / tk中,代码可能看起来像这样:
package require Img set image [image create photo -file /path/to/image.bmp] label .l -image $image pack .l
有关更多信息,请访问http://wiki.tcl.tk/6165
回答
自从我将LTK用于任何东西已经有一段时间了,但是使用LTK显示图像的最简单方法如下:
(defpackage #:ltk-image-example (:use #:cl #:ltk)) (in-package #:ltk-image-example) (defun image-example () (with-ltk () (let ((image (make-image))) (image-load image "testimage.gif") (let ((canvas (make-instance 'canvas))) (create-image canvas 0 0 :image image) (configure canvas :width 800) (configure canvas :height 640) (pack canvas)))))
不幸的是,默认情况下我们可以对图像进行有限的操作,并且只能使用gif或者ppm图像,但是ppm文件格式非常简单,我们可以轻松地从位图创建ppm图像。但是,我们说要操纵显示的图像,然后查看定义该图像对象的代码:
(defclass photo-image(tkobject) ((data :accessor data :initform nil :initarg :data) ) ) (defmethod widget-path ((photo photo-image)) (name photo)) (defmethod initialize-instance :after ((p photo-image) &key width height format grayscale data) (check-type data (or null string)) (setf (name p) (create-name)) (format-wish "image create photo ~A~@[ -width ~a~]~@[ -height ~a~]~@[ -format \"~a\"~]~@[ -grayscale~*~]~@[ -data ~s~]" (name p) width height format grayscale data)) (defun make-image () (let* ((name (create-name)) (i (make-instance 'photo-image :name name))) ;(create i) i)) (defgeneric image-load (p filename)) (defmethod image-load((p photo-image) filename) ;(format t "loading file ~a~&" filename) (send-wish (format nil "~A read {~A} -shrink" (name p) filename)) p)
看起来图像的实际数据是由Tcl / Tk解释器存储的,不能从Lisp内部访问。如果要访问它,则可能需要使用format-wish和send-wish编写自己的函数。
当然,我们可以简单地在画布对象上单独渲染每个像素,但是我认为这样做不会获得很好的性能,一旦我们尝试在画布上显示数千种不同的东西,画布小部件就会变得有点慢。它。因此,总结一下,如果我们不关心实时进行任何操作,则可以在每次要显示位图时将其保存为.ppm图像,然后使用上面最简单的代码简单地将其加载。否则,我们可以尝试从tk本身访问数据(将其作为ppm图像加载一次之后),最后,如果这些都不起作用,我们可以切换到另一个工具箱。大多数不错的Lisp GUI工具包都适用于Linux,因此如果我们使用Windows,则可能会不走运。