Вопрос

Я написал код для чтения растрового изображения 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 предназначены для 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