[cl-pdf-devel] png image representation

Thibault Langlois tl at di.fc.ul.pt
Thu May 31 21:48:32 UTC 2007


On 5/30/07, Marc Battyani <marc.battyani at fractalconcept.com> wrote:
> "Thibault Langlois" <tl at di.fc.ul.pt> wrote:
>
> > On 5/30/07, iso at localhost.di.fc.ul.pt <iso at localhost.di.fc.ul.pt> wrote:
> >>
> >> Maybe you don't need PNG for that. If you have a vector of pixel
> >> values, then just use something like this:
> >>
> >> (defun my-image (pixels width height)
> >>   (let ((image (make-instance 'pdf:image
> >>                  :color-space "DeviceCMYK"
> >>                  :filter nil
> >>                  :bits pixels
> >>                  :width width
> >>                  :height height)))
> >>     (pdf:add-images-to-page image)
> >>     (pdf:paint-image image)))
>
> Yes I think it's probably easier than going through a png.
>
>
> > Each pixel in the imago format is a unsigned 32bits that
> > represents R, G, B and Alpha channel.
> >
> >> This assumes that you want to use colour separations and that the
> >> dimensions of the pixel vector are (* width height 4). If you
> >> have a grayscale image, then use DeviceGray instead of DeviceCMYK. Of
> >
> > Each pixel in the imago format is a unsigned 32bits that
> > represents R, G, B and Alpha channel.
> >
> >> course, you can also use DeviceRGB (then the pixel vector should look
> >> like this: R00 G00 B00 R01 G01 B01 ..., where R01 is the Red value of
> >> the pixel at row 0 column 1).
> >
> > I tried to follow your suggestion using a DeviceRGB.
> > First I got an error when the :bits argument is a vector of
> > bytes. Looking at the code it seems that this argument must
> > be a string (the data is passed to a pdf-stream and then to the
> > compress-pdf-stream function where compress-string is called).
> >
> > So I converted each byte into a char to build a string. I do not
> > get any errors but the image does not appear in the document.
> >
> > (defun image-example-1 (&optional (file #P"/home/tl/Desktop/ex.pdf"))
> >  (pdf:with-document ()
> >    (let* ((imago-image ;; Load an image as a imago:rgb-image
> >            (imago:read-png "/home/tl/Photos/lemon-slice.png"))
> >           (pdf-image ;; make a pdf-image using image data
> >            (make-instance 'pdf:image
> >                           :color-space "DeviceRGB"
> >                           :filter nil
> >                           :bits (string-of-bytes imago-image)
> >                           :width (imago:image-width imago-image)
> >                           :height (imago:image-height imago-image))))
> >      (pdf:with-page (:bounds (vector 0 0 400 300))
> >        (pdf:add-images-to-page pdf-image)
> >        (pdf:draw-image pdf-image 10 100 250 120 0 t)
> >        (pdf:write-document file)))))
> >
> > The string-of-bytes function collect the r g b components and
> > build a string:
> > (defun string-of-bytes (imago-rgb-image)
> >  (let (color-values)
> >    (imago:do-image-pixels (imago-rgb-image c x y)
> >      (setq color-values
> >            (nconc color-values
> >                   (list (code-char (imago:color-red c))
> >                         (code-char (imago:color-green c))
> >                         (code-char (imago:color-blue c))))))
> >    (coerce color-values 'string)))
> >
> > My first attempt was to make a vector:
> >
> > (defun vector-of-bytes (imago-rgb-image)
> >  (let (color-values)
> >    (imago:do-image-pixels (imago-rgb-image c x y)
> >      (setq color-values
> >            (nconc color-values
> >                   (list (imago:color-red c)
> >                         (imago:color-green c)
> >                         (imago:color-blue c)))))
> >    (coerce color-values 'vector)))
> >
> > Any help will be appreciated.
>
> Have you looked at example3 in examples.lisp? It creates an in memory image
> that is put into the pdf.

Strangely I started with example7 ... Thanks for the suggestion.
I solved my problem after looking at example3.

Thibault

>
> Marc
>
>
>


-- 
Thibault Langlois
FCUL / DI



More information about the cl-pdf-devel mailing list