質問

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 イメージとして保存し、上記のコードを使用して単純にロードすることができます。これが最も簡単です。それ以外の場合は、(ppm イメージとして一度ロードした後) tk 自体からデータにアクセスしようとすることができ、最終的にどれも機能しない場合は、別のツールキットに切り替えることができます。まともな 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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top