X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=cameras.lisp;h=515c61effeae7d0b3f4ff0d068a9108782584dd0;hb=5cd7ba4f15110d2d6114e7f4488aad656eeea287;hp=c084fec013014d84e4b17cd20e6014a7247577f1;hpb=fa6f225e030638160cbd91d19cebd29f741068e8;p=cl-photo.git diff --git a/cameras.lisp b/cameras.lisp index c084fec..515c61e 100644 --- a/cameras.lisp +++ b/cameras.lisp @@ -35,75 +35,87 @@ (defparameter +format-db+ '( - (:format :d2x :make "Nikon" :pixels (4288 . 2848) :imager (23.7 . 15.6) :name "D2X") - (:format :d100 :make "Nikon" :pixels (3037 . 2024) :imager (23.7 . 15.6) :name "D100") - (:format :d70 :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70") - (:format :d70s :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70s") - (:format :d50 :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70") - (:format :d1x :make "Nikon" :pixels (4028 . 1324) :imager (23.7 . 15.6) :name "D1X") - (:format :d2h :make "Nikon" :pixels (2464 . 1632) :imager (23.3 . 15.5) :name "D2H") - (:format :d2hs :make "Nikon" :pixels (2464 . 1632) :imager (23.3 . 15.5) :name "D2Hs") - - (:format :300d :make "Canon" :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "300D") - (:format :10d :make "Canon" :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "10D") - (:format :d30 :make "Canon" :pixels (0 . 0) :imager (22.7 . 15.1) :name "D30") + (:format :d2x :make "Nikon" :pixels (4288 . 2848) :imager (23.7 . 15.6) :name "D2X") + (:format :d100 :make "Nikon" :pixels (3037 . 2024) :imager (23.7 . 15.6) :name "D100") + (:format :d70 :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70") + (:format :d70s :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D70s") + (:format :d50 :make "Nikon" :pixels (3008 . 2000) :imager (23.7 . 15.6) :name "D50") + (:format :d1x :make "Nikon" :pixels (4028 . 1324) :imager (23.7 . 15.6) :name "D1X") + (:format :d2h :make "Nikon" :pixels (2464 . 1632) :imager (23.3 . 15.5) :name "D2H") + (:format :d2hs :make "Nikon" :pixels (2464 . 1632) :imager (23.3 . 15.5) :name "D2Hs") + + (:format :300d :make "Canon" :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "300D") + (:format :10d :make "Canon" :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "10D") + (:format :d30 :make "Canon" :pixels (2160 . 1440) :imager (22 . 14.9) :name "D30") (:format :d60 :make "Canon" :pixels (3072 . 2048) :imager (22.7 . 15.1) :name "D60") - (:format :350d :make "Canon" :pixels (3456 . 2304) :imager (22.2 . 14.8) :name "350D") - (:format :1d :make "Canon" :pixels (2464 . 1648) :imager (27 . 17.8) :name "1D") - (:format :20d :make "Canon" :pixels (3456 . 2304) :imager (22.5 . 15) :name "20D") - (:format :1dmkii :make "Canon" :pixels (3504 . 2336) :imager (28.7 . 19.1) - :name "1D Mark II" :nicks (:1d2 :1dii :1dmkii)) - (:format :1ds :make "Canon" :pixels (4064 . 3328) :imager (36 . 24) :name "1Ds") - (:format :1dsmkii :make "Canon" :pixels (4992 . 3328) :imager (36 . 24) + (:format :350d :make "Canon" :pixels (3456 . 2304) :imager (22.2 . 14.8) :name "350D") + (:format :1d :make "Canon" :pixels (2464 . 1648) :imager (27 . 17.8) :name "1D") + (:format :20d :make "Canon" :pixels (3456 . 2304) :imager (22.5 . 15) :name "20D") + (:format :1dmkii :make "Canon" :pixels (3504 . 2336) :imager (28.7 . 19.1) + :name "1D Mark II" :nicks (:1d2 :1dii :1dmkii)) + (:format :1ds :make "Canon" :pixels (4064 . 3328) :imager (36 . 24) :name "1Ds") + (:format :1dsmkii :make "Canon" :pixels (4992 . 3328) :imager (36 . 24) :name "1Ds Mark II" :nicks (:1ds2 :1dsii)) + + (:format :35mm :imager (36 . 24) :name "35mm") + + (:format :6x4.5cm :imager (60 . 45) :name "6x4.5cm" :nicks (:\645)) + (:format :6x6cm :imager (60 . 60) :name "6x6cm" :nicks (:6x6)) + (:format :6x7cm :imager (60 . 70) :name "6x7cm" :nicks (:6x7)) + (:format :6x9cm :imager (60 . 90) :name "6x9cm" :nicks (:6x9)) + (:format :6x12cm :imager (60 . 120) :name "6x12cm" :nicks (:6x12)) + + #.(make-output-format 4 5) + #.(make-output-format 5 7) + #.(make-output-format 8 10) + #.(make-output-format 11 13.75) + #.(make-output-format 11 16.5) + #.(make-output-format 13 16.25) + #.(make-output-format 13 19) + #.(make-output-format 16 20) + #.(make-output-format 16 24) + #.(make-output-format 18 22.5) + #.(make-output-format 18 24) + #.(make-output-format 24 30) + #.(make-output-format 24 36) + )) - (:format :35mm :imager (36 . 24) :name "35mm") - - (:format :6x4.5cm :imager (60 . 45) :name "6x4.5cm" :nicks (:\645)) - (:format :6x6cm :imager (60 . 60) :name "6x6cm" :nicks (:6x6)) - (:format :6x7cm :imager (60 . 70) :name "6x7cm" :nicks (:6x7)) - (:format :6x9cm :imager (60 . 90) :name "6x9cm" :nicks (:6x9)) - (:format :6x12cm :imager (60 . 120) :name "6x12cm" :nicks (:6x12)) - - #.(make-output-format 4 5) - #.(make-output-format 5 7) - #.(make-output-format 8 10) - #.(make-output-format 11 13.75) - #.(make-output-format 11 16.5) - #.(make-output-format 13 16.25) - #.(make-output-format 13 19) - #.(make-output-format 16 20) - #.(make-output-format 16 24) - #.(make-output-format 18 22.5) - #.(make-output-format 18 24) - #.(make-output-format 24 30) - #.(make-output-format 24 36) - )) - -(defvar *digital-cameras* - (sort (loop for format in +format-db+ - when (getf format :pixels) - collect format) +(defun sort-formats (formats) + (sort formats (lambda (a b) (block nil - (when (and (getf a :make) (getf b :make)) - (cond - ((string-greaterp (getf a :make) (getf b :make)) - (return t)) - ((string-lessp (getf a :make) (getf b :make)) - (return nil)))) + (cond + ((and (null (getf a :make)) (getf b :make)) + (return nil)) + ((and (getf a :make) (null (getf b :make))) + (return t)) + ((string-greaterp (getf a :make) (getf b :make)) + (return t)) + ((string-lessp (getf a :make) (getf b :make)) + (return nil))) (when (and (getf a :name) (getf b :name)) (cond - ((string-lessp (getf a :name) (getf b :name)) - (return t)) - ((string-greaterp (getf a :name) (getf b :name)) - (return nil)))))))) + ((string-lessp (getf a :name) (getf b :name)) + (return t)) + ((string-greaterp (getf a :name) (getf b :name)) + (return nil)))))))) + +(defvar *digital-cameras* + (sort-formats (loop for format in +format-db+ + when (getf format :pixels) + collect format))) + +(defvar *cameras* + (sort-formats (loop for format in +format-db+ + when (getf format :imager) + collect format))) (defun format-match-p (format-spec format) - (when (or (eql format-spec (getf format :format)) - (member format-spec (getf format :nicks))) - t)) + (let ((key (ensure-keyword format-spec))) + (when (or (eql key (getf format :format)) + (member key (getf format :nicks))) + t))) (defun find-format (format-spec) (find format-spec +format-db+ :test 'format-match-p)) @@ -115,7 +127,7 @@ the number of megapixels of the sensor. FORMAT should be defined if the CAMERA-SPEC is the number of megapixels so the proper aspect ratio is used." (etypecase sensor-spec - (keyword + ((or string keyword) (getf (find-format sensor-spec) :pixels)) (number (sensor-dimensions-megapixels format sensor-spec)))) @@ -124,6 +136,12 @@ so the proper aspect ratio is used." "Returns the imager dimensions in mm of a FORMAT." (getf (find-format format-spec) :imager)) +(defun pixel-size (format-spec) + "Return pixel size in micrometers." + (let ((pixel-dim (pixel-dimensions format-spec)) + (imager-dim (imager-dimensions format-spec))) + (values (* 1000 (/ (car imager-dim) (car pixel-dim))) + (* 1000 (/ (cdr imager-dim) (cdr pixel-dim)))))) (defun output-dimensions (format-spec) "Returns the output dimensions in mm of a FORMAT." (getf (find-format format-spec) :output))