NAME
Image::Leptonica::Func::gifio
VERSION
version 0.04
gifio.c
gifio.c
Read gif from file
PIX *pixReadStreamGif()
static PIX *pixInterlaceGIF()
Write gif to file
l_int32 pixWriteStreamGif()
Read/write from/to memory (see warning)
PIX *pixReadMemGif()
l_int32 pixWriteMemGif()
This uses the gif library, version 4.1.6 or later.
Do not use 4.1.4. It has serious problems handling 1 bpp images.
The initial version of this module was generously contribued by
Antony Dovgal. He can be contacted at: tony *AT* daylessday.org
There are some issues with version 5:
- valgrind detects uninitialized values used used for writing
and conditionally jumping in EGifPutScreenDesc().
- DGifSlurp() crashes on some images, apparently triggered by
by some GIF extension records. The latter problem has been
reported but not resolved as of October 2013.
FUNCTIONS
pixReadMemGif
PIX * pixReadMemGif ( const l_uint8 *cdata, size_t size )
pixReadMemGif()
Input: data (const; gif-encoded)
size (of data)
Return: pix, or null on error
Notes:
(1) Of course, we are cheating here -- writing the data to file
in gif format and reading it back in. We can't use the
GNU runtime extension fmemopen() to avoid writing to a file
because libgif doesn't have a file stream interface!
(2) This should not be assumed to be safe from a sophisticated
attack, even though we have attempted to make the filename
difficult to guess by embedding the process number and the
current time in microseconds. The best way to handle
temporary files is to use file descriptors (capabilities)
or file handles. However, I know of no way to do this
for gif files because of the way that libgif handles the
file descriptors. The canonical approach would be to do this:
char templ[] = "hiddenfilenameXXXXXX";
l_int32 fd = mkstemp(templ);
FILE *fp = fdopen(fd, "w+b");
fwrite(data, 1, size, fp);
rewind(fp);
Pix *pix = pixReadStreamGif(fp);
but this fails because fp is in a bad state after writing.
pixReadStreamGif
PIX * pixReadStreamGif ( FILE *fp )
pixReadStreamGif()
Input: stream
Return: pix, or null on error
pixWriteMemGif
l_int32 pixWriteMemGif ( l_uint8 **pdata, size_t *psize, PIX *pix )
pixWriteMemGif()
Input: &data (<return> data of gif compressed image)
&size (<return> size of returned data)
pix
Return: 0 if OK, 1 on error
Notes:
(1) See comments in pixReadMemGif()
pixWriteStreamGif
l_int32 pixWriteStreamGif ( FILE *fp, PIX *pix )
pixWriteStreamGif()
Input: stream
pix (1, 2, 4, 8, 16 or 32 bpp)
Return: 0 if OK, 1 on error
Notes:
(1) All output gif have colormaps. If the pix is 32 bpp rgb,
this quantizes the colors and writes out 8 bpp.
If the pix is 16 bpp grayscale, it converts to 8 bpp first.
(2) We can't write to memory using open_memstream() because
the gif functions write through a file descriptor, not a
file stream.
AUTHOR
Zakariyya Mughal <zmughal@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by Zakariyya Mughal.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.