Windowsビットマップを読み取るコードを記述しましたが、ltkで表示したいと思います。適切なオブジェクトを作成するにはどうすればよいですか?ltkにそのような機能はありますか?そうでない場合は、どうすればtkに直接インターフェースできますか?
2 に答える
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 内からはアクセスできないようです。アクセスしたい場合は、おそらくformat-wishとsend- wish を使用して独自の関数を作成する必要があります。
もちろん、キャンバス オブジェクトで各ピクセルを個別にレンダリングすることもできますが、それを行うと非常に優れたパフォーマンスが得られるとは思いません。数千を超える異なるものを表示しようとすると、キャンバス ウィジェットが少し遅くなります。それ。要約すると、リアルタイムで何かを行う必要がない場合は、表示するたびにビットマップを .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にあります。