Lisp 如何使用ltk显示图像?

Lisp 如何使用ltk显示图像?,lisp,tcl,tk,sbcl,ltk,Lisp,Tcl,Tk,Sbcl,Ltk,我已经编写了读取windows位图的代码,现在想用ltk显示它。如何构造适当的对象?ltk中有这样的功能吗?如果没有,如何直接与tk接口?tk本机不支持windows位图文件。然而,“Img”扩展确实存在,并且在几乎每个平台上都可以免费使用。您不需要在中读取数据,您可以直接从磁盘上的文件创建映像。在普通的tcl/tk中,您的代码可能如下所示: package require Img set image [image create photo -file /path/to/image.bmp] l

我已经编写了读取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

更多信息可以在

上找到,我已经有一段时间没有使用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图像。但是,如果您希望操纵显示的图像,并查看定义图像对象的代码:

(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中访问。如果您想访问它,您可能需要使用格式wish发送wish编写自己的函数


当然,您可以简单地在画布对象上单独渲染每个像素,但我认为这样做不会获得很好的性能,当您尝试在画布上显示数千种不同的内容时,画布小部件会变得有点慢。因此,总而言之,如果您不关心实时执行任何操作,您可以在每次需要显示位图时将其保存为.ppm图像,然后使用上面的代码简单地加载它,这将是最简单的。否则,您可以尝试从tk本身访问数据(在将其作为ppm映像加载一次之后),最后,如果这些都不起作用,您可以切换到另一个工具包。大多数体面的lisp GUI工具包都是针对linux的,因此如果您使用windows,可能会运气不佳。

在这种情况下,我的问题是:如何获取数据?我想应用一些图像过滤器。