Question

J'ai écrit du code pour lire un bitmap Windows et je voudrais maintenant l'afficher avec ltk. Comment puis-je construire un objet approprié? Existe-t-il une telle fonctionnalité dans LTK? Si non, comment puis-je le faire directement en interface avec tk?

Était-ce utile?

La solution

Cela fait longtemps que je n’utilise plus LTK, mais la façon la plus simple d’afficher une image avec LTK est la suivante:

(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)))))

Malheureusement, ce que vous pouvez faire avec l'image par défaut est assez limité et vous ne pouvez utiliser que des images gif ou ppm - mais le Le format de fichier ppm est très simple, vous pouvez facilement créer une image ppm à partir de votre image bitmap. Cependant, vous dites vouloir manipuler l'image affichée et consulter le code qui définit l'objet image:

(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)

Il semble que les données réelles de l'image soient stockées par l'interpréteur Tcl / Tk et non accessibles de l'intérieur de lisp. Si vous souhaitez y accéder, vous devrez probablement écrire vos propres fonctions à l'aide des format-wish et send-wish .

Bien sûr, vous pouvez simplement restituer chaque pixel individuellement sur un objet de la toile, mais je ne pense pas que vous obtiendriez de très bonnes performances, car le widget de la toile devient un peu lent lorsque vous essayez d'afficher plus de quelques milliers choses différentes dessus. En résumé, si vous ne souhaitez rien faire en temps réel, vous pouvez enregistrer votre bitmap en tant qu'image .ppm à chaque fois que vous souhaitez l'afficher, puis le charger simplement à l'aide du code ci-dessus. Ce serait le plus simple. Sinon, vous pourriez essayer d'accéder aux données à partir de tk lui-même (après l'avoir chargée une fois en tant qu'image ppm), enfin si rien ne fonctionne, vous pouvez passer à une autre boîte à outils. La plupart des boîtes à outils d'interface graphique de Lisp sont destinées à Linux. Vous risquez donc d'être malchanceux si vous utilisez Windows.

Autres conseils

Tk ne supporte pas nativement les fichiers bitmap Windows. Cependant, le " Img " L'extension est et est disponible gratuitement sur à peu près toutes les plateformes. Vous n'avez pas besoin de lire les données, vous pouvez créer l'image directement à partir du fichier sur le disque. En clair, tcl / tk, votre code pourrait ressembler à ceci:

package require Img
set image [image create photo -file /path/to/image.bmp]
label .l -image $image
pack .l

Vous trouverez un peu plus d'informations à l'adresse http://wiki.tcl.tk/6165 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top