File: eusjpeg.l

package info (click to toggle)
euslisp 9.32%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 55,268 kB
  • sloc: ansic: 41,693; lisp: 3,339; makefile: 286; sh: 238; asm: 138; python: 53
file content (134 lines) | stat: -rw-r--r-- 4,733 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
;;;; eusjpeg.l
;;; (c) 1997, Toshihiro Matsui, Electrotechnical Laboratory
;;; 
;;; links libjpeg.so library and makes entries to jpeg_compress and
;;; jpeg_decompress.  Support routines defined in jmemcd.c handles
;;; stream I/O with image data stored in core.
;;; jpegmemcd.so, which needs /usr/local/lib/libjpeg.so, must be
;;; generated first.
;;;
;;; Aug 1999 allocation of memory for decompressing is optimized.
;;; Aug 1999 decompressed image is always returnd as a color-image24.

(in-package "IMAGE")

(export '(jpeg-compress jpeg-decompress 
	  read-jpeg-file write-jpeg-file))

(eval-when (load eval)
  (let ((m
         (load-foreign
          (find-if #'probe-file
		   (list (format nil "~A/~A/lib/jpegmemcd.so" *eusdir*
				 (cond ((member :solaris2 *features*)  "SunOS5")
				       ((member :irix *features*) "IRIX")
				       ((member :irix6 *features*) "IRIX6")
				       ((member :darwin *features*) "Darwin")
				       ((member :sh4 *features*) "LinuxSH4")
				       ((member :linux *features*)
					(cond
					 ((member :x86_64 *features*)
					  "Linux64")
					 ((member :arm *features*)
					  "LinuxARM")
					 (t "Linux")))
				       ((member :SunOS4.1 *features*) "SunOS4")
				       ((member :Windows *features*) "Windows")
				       ((member :Windows95 *features*) "Win95")
				       ((member :WindowsNT *features*) "WinNT")
				       ((member :alpha *features*) "Alpha")
				       ((member :cygwin *features*) "Cygwin")))
	  (format nil "/usr/lib/~A/euslisp/jpegmemcd.so" lisp::*deb-host-multiarch*))))))
    (defforeign jpeg_header m "JPEG_header" () :integer)
    (defforeign jpeg_decompress m "JPEG_decompress" () :integer)
    (defforeign jpeg_compress m "JPEG_compress" () :integer)))


(defun jpeg-compress (rgb-image &optional (quality 50) (jpeg-buffer) )
   (let* ((w (send rgb-image :width))
	  (h (send rgb-image :height))
	  jpeg-size
	  )
      (setq rgb-image (send rgb-image :to24))
      (if (not (derivedp rgb-image color-image24))
	  (error "jpeg-compress expected 24-bit color-image, but ~s~%"
		 rgb-image))
      ;; We cannot predict exact size of the compressed file.
      ;; So, prepare a buffer for no compression.
      (if (null jpeg-buffer)
	  (setq jpeg-buffer (make-string (* w h 3))))
      (setq jpeg-size 
	    (jpeg_compress (send rgb-image :entity)  w h
	   	jpeg-buffer (length jpeg-buffer) quality))
      (list jpeg-buffer jpeg-size)
      )   )

(defun write-jpeg-file (fname rgb-image &optional (quality 80))
	;; rgb-image is either a long-pixel-image or deep-pixel-image
	;; 
    (let (r)
       (setq r (jpeg-compress rgb-image))
       (setq fname (merge-pathnames fname ".jpg"))
       (with-open-file (f fname :direction :output)
	   (unix:write f (car r) (second r)))
       fname))

;****************************************************************
;; jpeg-decompress and read-jpeg-file
;; return a color-image24 object.
;;

(defun jpeg-decompress (jpeg-image #| byte vector (string) |# )
   ;; jpeg-image is a raw jpeg binary string
   ;; returns a list of rgb-image, width, and height.
   ;; rgp-image might be supplied as the second argument to this function 
   (let ((width-return (integer-vector 0))
	 (height-return (integer-vector 0))
	 (components-return (integer-vector 0))
	 (image-return (integer-vector 0))
	 decomp-image-address decomp-image-string
	 total-size width height result-image)
      ;; identify the jpeg output image size
      (setq total-size
	    (jpeg_header jpeg-image (length jpeg-image)
		width-return height-return components-return))
      (if (zerop total-size)
	  (return-from jpeg-decompress nil))
      ;; allocate output image memory
      (setq result-image (make-string total-size))
      (jpeg_decompress jpeg-image (length jpeg-image)
			result-image
		       width-return height-return)
      ;;
      (setq width (aref width-return 0) height (aref height-return 0))
      (instance img:color-image24 :init width height result-image)
     )   )

(defun read-jpeg-file (fname)
   (setq fname  (merge-pathnames fname ".jpg"))
   (if (probe-file fname)
	(let ((decomp-image (jpeg-decompress (read-binary-file fname))))
	   ;; put the file name in the name attribute
	   (send decomp-image :name (namestring fname))
	   decomp-image)
	nil)
    )

(defun catalog-jpeg-files (&optional (dir "."))
   (let ((xwins) (pictures) (pic) (xx))
     (dolist (f (directory dir))
	(setq pic (read-jpeg-file f))
	(when pic
		(setq xx (instance x:xwindow :create :width (send pic :width)
						:height (send pic :height)))
		(setq pic (send pic :to24))
		(swap-rgb pic)
		(send xx :putimage (pic . entity))
		(push pic pictures)
		(push xx xwins)) )
      (list xwins pictures)     )
   )

(provide :jpeg "#(@)$Id$")