gpt4 book ai didi

lisp - 如何使用 ltk 显示图像?

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:03 29 4
gpt4 key购买 nike

我已经编写了读取 Windows 位图的代码,现在想用 ltk 显示它。我怎样才能构造一个合适的对象? ltk中有这样的功能吗?如果不是,我如何才能直接连接到 tk?

最佳答案

我已经有一段时间没有使用 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 file format非常简单,您可以轻松地从位图中创建 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-wishsend-wish 编写自己的函数。

当然,您可以简单地在 Canvas 对象上单独渲染每个像素,但我认为您这样做不会获得很好的性能,一旦您尝试显示超过几千个, Canvas 小部件就会变得有点慢上面有不同的东西。所以总结一下——如果你不关心实时做任何事情,你可以在每次你想显示它时将你的位图保存为 .ppm 图像,然后简单地使用上面的代码加载它——这将是最简单的。否则你可以尝试从 tk 本身访问数据(在将它作为 ppm 图像加载一次之后),最后如果这些都不起作用你可以切换到另一个工具包。大多数不错的 lisp GUI 工具包都适用于 linux,因此如果您使用的是 windows,您可能就不走运了。

关于lisp - 如何使用 ltk 显示图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77934/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com