문제
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 파일 형식 매우 간단하므로 비트맵에서 쉽게 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 내에서는 액세스할 수 없는 것처럼 보입니다.그것에 접근하고 싶다면 아마도 다음을 사용하여 함수를 직접 작성해야 할 것입니다. 형식 희망 그리고 소원을 보내다.
물론 단순히 캔버스 개체에 각 픽셀을 개별적으로 렌더링할 수도 있지만 그렇게 하면 매우 좋은 성능을 얻을 수 없을 것 같습니다. 캔버스 위젯에 수천 개 이상의 다양한 항목을 표시하려고 하면 캔버스 위젯이 약간 느려집니다. 그것.요약하자면, 실시간으로 작업하는 데 관심이 없다면 비트맵을 표시하고 싶을 때마다 .ppm 이미지로 저장한 다음 위의 코드를 사용하여 간단히 로드할 수 있습니다. 이것이 가장 쉽습니다.그렇지 않으면 tk 자체에서 데이터에 액세스하려고 시도할 수 있습니다(ppm 이미지로 한 번 로드한 후). 마지막으로 아무 것도 작동하지 않으면 다른 툴킷으로 전환할 수 있습니다.괜찮은 lisp GUI 툴킷의 대부분은 Linux용이므로 Windows를 사용하는 경우 운이 좋지 않을 수 있습니다.
다른 팁
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