2008-09-16 11 views
4

J'ai écrit du code pour lire un bitmap Windows et voudrais maintenant l'afficher avec ltk. Comment puis-je construire un objet approprié? Y at-il une telle fonctionnalité dans ltk? Sinon comment puis-je le faire directement en interfaçage avec tk?Comment afficher une image avec ltk?

Répondre

3

Il a été un moment que je LTK pour quoi que ce soit, mais le moyen le plus simple de 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ée, et vous ne pouvez utiliser des images GIF ou ppm - mais le ppm file format est très simple, vous pouvez facilement créer une image ppm à partir de votre bitmap. Cependant, vous dites que vous voulez manipuler l'image affichée, et en regardant le code qui définit l'objet d'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 [email protected][ -width ~a~][email protected][ -height ~a~][email protected][ -format \"~a\"~][email protected][ -grayscale~*~][email protected][ -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 est stockée par l'interpréteur Tcl/Tk et non accessible de l'intérieur de lisp. Si vous voulez y accéder, vous devrez probablement écrire vos propres fonctions en utilisant format-souhaiter et envoyer-souhaiter.

Bien sûr, vous pouvez simplement rendre chaque pixel individuellement sur un objet canvas, mais je ne pense pas que vous obtiendriez de très bonnes performances, le widget canvas devient un peu lent lorsque vous essayez d'afficher plus de mille choses différentes à ce sujet. Donc, pour récapituler - si vous ne faites rien en temps réel, vous pouvez enregistrer votre bitmap comme une image .ppm chaque fois que vous voulez l'afficher et ensuite simplement le charger en utilisant le code ci-dessus - ce serait le plus facile. Sinon, vous pourriez essayer d'accéder aux données de tk lui-même (après l'avoir chargé une fois comme une image ppm), enfin si rien de tout cela ne fonctionne, vous pouvez passer à une autre boîte à outils. La plupart des toolkits d'interface graphique de lisp décent sont pour linux, ainsi vous pouvez avoir de la chance si vous utilisez Windows.

2

Tk ne prend pas en charge nativement les fichiers bitmap Windows. Cependant, l'extension "Img" est disponible gratuitement sur presque toutes les plates-formes. Vous n'avez pas besoin de lire les données, vous pouvez créer l'image directement à partir du fichier sur le disque. Dans tcl/tk plaine votre code pourrait ressembler à ceci:

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

un peu plus d'informations sont disponibles sur http://wiki.tcl.tk/6165

+0

Dans ce cas, ma question est: Comment puis-je accéder aux données? Je voudrais appliquer des filtres d'image. – Sarien

Questions connexes