문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top