2008-09-16 12 views
4

Ich habe Code geschrieben, um ein Windows-Bitmap zu lesen und möchte es jetzt mit ltk anzeigen. Wie kann ich ein passendes Objekt konstruieren? Gibt es solche Funktionalität in ltk? Wenn nicht, wie kann ich direkt mit tk kommunizieren?Wie zeige ich ein Bild mit ltk?

Antwort

3

Es ist schon eine Weile zu finden, da ich LTK für alles verwendet, aber die einfachste Art und Weise zu ein Bild mit LTK Anzeige ist wie folgt:

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

Leider, was Sie mit dem Bild von Standard tun können, ist ziemlich begrenzt, und man kann nur gif oder ppm Bilder verwenden - aber die ppm file format ist sehr einfach, man konnte leicht Erstellen Sie ein ppm-Bild von Ihre Bitmap. Aber Sie sagen, dass Sie das angezeigte Bild manipulieren möchten, und Blick auf den Code, der das Bild-Objekt definiert:

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

Es sieht aus wie die die tatsächlichen Daten für das Bild wird durch die Tcl/Tk-Interpreter gespeichert und nicht zugänglich von innen lisp. Wenn Sie darauf zugreifen möchten, müssten Sie wahrscheinlich eigene Funktionen schreiben, indem Sie format-wish und send-wish verwenden.

Natürlich könnten Sie jeden Pixel einzeln auf einem Canvas-Objekt rendern, aber ich denke nicht, dass Sie eine sehr gute Leistung erzielen würden. Das Canvas-Widget wird langsam langsamer, wenn Sie mehr als ein paar anzeigen möchten tausend verschiedene Dinge drauf. Zusammengefasst: Wenn Sie nichts in Echtzeit machen möchten, können Sie Ihre Bitmap jedes Mal, wenn Sie sie anzeigen wollten, als .ppm-Bild speichern und dann einfach mit dem obigen Code laden - das wäre am einfachsten. Andernfalls könnten Sie versuchen, auf die Daten von tk selbst zuzugreifen (nachdem Sie sie einmal als ppm-Bild geladen haben). Wenn das alles nicht funktioniert, können Sie zu einem anderen Toolkit wechseln. Die meisten dezenten Lisp GUI Toolkits sind für Linux gedacht, daher kann es passieren, dass Sie kein Glück haben, wenn Sie Windows benutzen.

2

Tk unterstützt Windows-Bitmap-Dateien nicht nativ. Die Erweiterung "Img" ist und ist jedoch auf fast jeder Plattform frei verfügbar. Sie müssen die Daten nicht einlesen, Sie können das Bild direkt aus der Datei auf der Festplatte erstellen. Im Klar Tcl/Tk könnte Ihr Code wie folgt aussehen:

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

ein wenig mehr Informationen unter http://wiki.tcl.tk/6165

+0

In diesem Fall ist meine Frage: Wie komme ich zu den Daten? Ich möchte einige Bildfilter anwenden. – Sarien

Verwandte Themen