سؤال

لقد كتبت رمزًا لقراءة الصورة النقطية لنظام التشغيل Windows وأرغب الآن في عرضها باستخدام ltk.كيف يمكنني بناء كائن مناسب؟هل هناك مثل هذه الوظيفة في ltk؟إذا لم يكن الأمر كذلك فكيف يمكنني أن أفعل ذلك مباشرة مع المعارف التقليدية؟

هل كانت مفيدة؟

المحلول

لقد مر وقت طويل منذ أن استخدمت 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 أو جزء في المليون - ولكن تنسيق الملف جزء في المليون الأمر بسيط جدًا، يمكنك بسهولة إنشاء صورة جزء في المليون من الصورة النقطية الخاصة بك.ومع ذلك، فأنت تقول أنك تريد معالجة الصورة المعروضة، والنظر إلى الكود الذي يحدد كائن الصورة:

(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 في كل مرة تريد عرضها ثم تحميلها ببساطة باستخدام الكود أعلاه - سيكون ذلك هو الأسهل.بخلاف ذلك، يمكنك محاولة الوصول إلى البيانات من 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