NAME
Image::Leptonica::Func::pixcomp
VERSION
version 0.04
pixcomp.c
pixcomp.c
Pixcomp creation and destruction
PIXC *pixcompCreateFromPix()
PIXC *pixcompCreateFromString()
PIXC *pixcompCreateFromFile()
void pixcompDestroy()
Pixcomp accessors
l_int32 pixcompGetDimensions()
l_int32 pixcompDetermineFormat()
Pixcomp conversion to Pix
PIX *pixCreateFromPixcomp()
Pixacomp creation and destruction
PIXAC *pixacompCreate()
PIXAC *pixacompCreateWithInit()
PIXAC *pixacompCreateFromPixa()
PIXAC *pixacompCreateFromFiles()
PIXAC *pixacompCreateFromSA()
void pixacompDestroy()
Pixacomp addition/replacement
l_int32 pixacompAddPix()
l_int32 pixacompAddPixcomp()
static l_int32 pixacompExtendArray()
l_int32 pixacompReplacePix()
l_int32 pixacompReplacePixcomp()
l_int32 pixacompAddBox()
Pixacomp accessors
l_int32 pixacompGetCount()
PIXC *pixacompGetPixcomp()
PIX *pixacompGetPix()
l_int32 pixacompGetPixDimensions()
BOXA *pixacompGetBoxa()
l_int32 pixacompGetBoxaCount()
BOX *pixacompGetBox()
l_int32 pixacompGetBoxGeometry()
l_int32 pixacompGetOffset()
l_int32 pixacompSetOffset()
Pixacomp conversion to Pixa
PIXA *pixaCreateFromPixacomp()
Pixacomp serialized I/O
PIXAC *pixacompRead()
PIXAC *pixacompReadStream()
l_int32 pixacompWrite()
l_int32 pixacompWriteStream()
Conversion to pdf
l_int32 pixacompConvertToPdf()
l_int32 pixacompConvertToPdfData()
Output for debugging
l_int32 pixacompWriteStreamInfo()
l_int32 pixcompWriteStreamInfo()
PIX *pixacompDisplayTiledAndScaled()
The Pixacomp is an array of Pixcomp, where each Pixcomp is a compressed
string of the image. We don't use reference counting here.
The basic application is to allow a large array of highly
compressible images to reside in memory. We purposely don't
reuse the Pixa for this, to avoid confusion and programming errors.
Three compression formats are used: g4, png and jpeg.
The compression type can be either specified or defaulted.
If specified and it is not possible to compress (for example,
you specify a jpeg on a 1 bpp image or one with a colormap),
the compression type defaults to png.
The serialized version of the Pixacomp is similar to that for
a Pixa, except that each Pixcomp can be compressed by one of
tiffg4, png, or jpeg. Unlike serialization of the Pixa,
serialization of the Pixacomp does not require any imaging
libraries because it simply reads and writes the compressed data.
There are two modes of use in accumulating images:
(1) addition to the end of the array
(2) random insertion (replacement) into the array
In use, we assume that the array is fully populated up to the
index value (n - 1), where n is the value of the pixcomp field n.
Addition can only be made to the end of the fully populated array,
at the index value n. Insertion can be made randomly, but again
only within the array of pixcomps; i.e., within the set of
indices {0 .... n-1}. The functions are pixacompReplacePix()
and pixacompReplacePixcomp(), and they destroy the existing pixcomp.
For addition to the end of the array, use pixacompCreate(), which
generates an initially empty array of pixcomps. For random
insertion and replacement of pixcomp into a pixacomp,
initialize a fully populated array using pixacompCreateWithInit().
The offset field allows you to use an offset-based index to
access the 0-based ptr array in the pixacomp. This would typically
be used to map the pixacomp array index to a page number, or v.v.
By default, the offset is 0. For example, suppose you have 50 images,
corresponding to page numbers 10 - 59. Then you would use
pixac = pixacompCreateWithInit(50, 10, ...);
This would allocate an array of 50 pixcomps, but if you asked for
the pix at index 10, using pixacompGetPix(pixac, 10), it would
apply the offset internally, returning the pix at index 0 in the array.
FUNCTIONS
pixCreateFromPixcomp
PIX * pixCreateFromPixcomp ( PIXC *pixc )
pixCreateFromPixcomp()
Input: pixc
Return: pix, or null on error
pixaCreateFromPixacomp
PIXA * pixaCreateFromPixacomp ( PIXAC *pixac, l_int32 accesstype )
pixaCreateFromPixacomp()
Input: pixac
accesstype (L_COPY, L_CLONE, L_COPY_CLONE; for boxa)
Return: pixa if OK, or null on error
pixacompAddBox
l_int32 pixacompAddBox ( PIXAC *pixac, BOX *box, l_int32 copyflag )
pixacompAddBox()
Input: pixac
box
copyflag (L_INSERT, L_COPY)
Return: 0 if OK, 1 on error
pixacompAddPix
l_int32 pixacompAddPix ( PIXAC *pixac, PIX *pix, l_int32 comptype )
pixacompAddPix()
Input: pixac
pix (to be added)
comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
Return: 0 if OK; 1 on error
Notes:
(1) The array is filled up to the (n-1)-th element, and this
converts the input pix to a pixcomp and adds it at
the n-th position.
pixacompAddPixcomp
l_int32 pixacompAddPixcomp ( PIXAC *pixac, PIXC *pixc )
pixacompAddPixcomp()
Input: pixac
pixc (to be added by insertion)
Return: 0 if OK; 1 on error
pixacompConvertToPdf
l_int32 pixacompConvertToPdf ( PIXAC *pixac, l_int32 res, l_float32 scalefactor, l_int32 type, l_int32 quality, const char *title, const char *fileout )
pixacompConvertToPdf()
Input: pixac (containing images all at the same resolution)
res (override the resolution of each input image, in ppi;
use 0 to respect the resolution embedded in the input)
scalefactor (scaling factor applied to each image; > 0.0)
type (encoding type (L_JPEG_ENCODE, L_G4_ENCODE,
L_FLATE_ENCODE, or 0 for default)
quality (used for JPEG only; 0 for default (75))
title (<optional> pdf title)
fileout (pdf file of all images)
Return: 0 if OK, 1 on error
Notes:
(1) This follows closely the function pixaConvertToPdf() in pdfio.c.
(2) The images are encoded with G4 if 1 bpp; JPEG if 8 bpp without
colormap and many colors, or 32 bpp; FLATE for anything else.
(3) The scalefactor must be > 0.0; otherwise it is set to 1.0.
(4) Specifying one of the three encoding types for @type forces
all images to be compressed with that type. Use 0 to have
the type determined for each image based on depth and whether
or not it has a colormap.
pixacompConvertToPdfData
l_int32 pixacompConvertToPdfData ( PIXAC *pixac, l_int32 res, l_float32 scalefactor, l_int32 type, l_int32 quality, const char *title, l_uint8 **pdata, size_t *pnbytes )
pixacompConvertToPdfData()
Input: pixac (containing images all at the same resolution)
res (input resolution of all images)
scalefactor (scaling factor applied to each image; > 0.0)
type (encoding type (L_JPEG_ENCODE, L_G4_ENCODE,
L_FLATE_ENCODE, or 0 for default)
quality (used for JPEG only; 0 for default (75))
title (<optional> pdf title)
&data (<return> output pdf data (of all images)
&nbytes (<return> size of output pdf data)
Return: 0 if OK, 1 on error
Notes:
(1) See pixacompConvertToPdf().
pixacompCreate
PIXAC * pixacompCreate ( l_int32 n )
pixacompCreate()
Input: n (initial number of ptrs)
Return: pixac, or null on error
pixacompCreateFromFiles
PIXAC * pixacompCreateFromFiles ( const char *dirname, const char *substr, l_int32 comptype )
pixacompCreateFromFiles()
Input: dirname
substr (<optional> substring filter on filenames; can be null)
comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
Return: pixac, or null on error
Notes:
(1) @dirname is the full path for the directory.
(2) @substr is the part of the file name (excluding
the directory) that is to be matched. All matching
filenames are read into the Pixa. If substr is NULL,
all filenames are read into the Pixa.
(3) Use @comptype == IFF_DEFAULT to have the compression
type automatically determined for each file.
(4) If the comptype is invalid for a file, the default will
be substituted.
pixacompCreateFromPixa
PIXAC * pixacompCreateFromPixa ( PIXA *pixa, l_int32 comptype, l_int32 accesstype )
pixacompCreateFromPixa()
Input: pixa
comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
accesstype (L_COPY, L_CLONE, L_COPY_CLONE)
Return: 0 if OK, 1 on error
Notes:
(1) If @format == IFF_DEFAULT, the conversion format for each
image is chosen automatically. Otherwise, we use the
specified format unless it can't be done (e.g., jpeg
for a 1, 2 or 4 bpp pix, or a pix with a colormap),
in which case we use the default (assumed best) compression.
(2) @accesstype is used to extract a boxa from @pixa.
pixacompCreateFromSA
PIXAC * pixacompCreateFromSA ( SARRAY *sa, l_int32 comptype )
pixacompCreateFromSA()
Input: sarray (full pathnames for all files)
comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
Return: pixac, or null on error
Notes:
(1) Use @comptype == IFF_DEFAULT to have the compression
type automatically determined for each file.
(2) If the comptype is invalid for a file, the default will
be substituted.
pixacompCreateWithInit
PIXAC * pixacompCreateWithInit ( l_int32 n, l_int32 offset, PIX *pix, l_int32 comptype )
pixacompCreateWithInit()
Input: n (initial number of ptrs)
offset (difference: accessor index - pixacomp array index)
pix (<optional> initialize each ptr in pixacomp to this pix;
can be NULL)
comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
Return: pixac, or null on error
Notes:
(1) Initializes a pixacomp to be fully populated with @pix,
compressed using @comptype. If @pix == NULL, @comptype
is ignored.
(2) Typically, the array is initialized with a tiny pix.
This is most easily done by setting @pix == NULL, causing
initialization of each array element with a tiny placeholder
pix (w = h = d = 1), using comptype = IFF_TIFF_G4 .
(3) Example usage:
// Generate pixacomp for pages 30 - 49. This has an array
// size of 20 and the page number offset is 30.
PixaComp *pixac = pixacompCreateWithInit(20, 30, NULL,
IFF_TIFF_G4);
// Now insert png-compressed images into the initialized array
for (pageno = 30; pageno < 50; pageno++) {
Pix *pixt = ... // derived from image[pageno]
if (pixt)
pixacompReplacePix(pixac, pageno, pixt, IFF_PNG);
pixDestroy(&pixt);
}
The result is a pixac with 20 compressed strings, and with
selected pixt replacing the placeholders.
To extract the image for page 38, which is decompressed
from element 8 in the array, use:
pixt = pixacompGetPix(pixac, 38);
pixacompDestroy
void pixacompDestroy ( PIXAC **ppixac )
pixacompDestroy()
Input: &pixac (<to be nulled>)
Return: void
Notes:
(1) Always nulls the input ptr.
pixacompDisplayTiledAndScaled
PIX * pixacompDisplayTiledAndScaled ( PIXAC *pixac, l_int32 outdepth, l_int32 tilewidth, l_int32 ncols, l_int32 background, l_int32 spacing, l_int32 border )
pixacompDisplayTiledAndScaled()
Input: pixac
outdepth (output depth: 1, 8 or 32 bpp)
tilewidth (each pix is scaled to this width)
ncols (number of tiles in each row)
background (0 for white, 1 for black; this is the color
of the spacing between the images)
spacing (between images, and on outside)
border (width of additional black border on each image;
use 0 for no border)
Return: pix of tiled images, or null on error
Notes:
(1) This is the same function as pixaDisplayTiledAndScaled(),
except it works on a Pixacomp instead of a Pix. It is particularly
useful for showing the images in a Pixacomp at reduced resolution.
(2) This can be used to tile a number of renderings of
an image that are at different scales and depths.
(3) Each image, after scaling and optionally adding the
black border, has width 'tilewidth'. Thus, the border does
not affect the spacing between the image tiles. The
maximum allowed border width is tilewidth / 5.
pixacompGetBox
BOX * pixacompGetBox ( PIXAC *pixac, l_int32 index, l_int32 accesstype )
pixacompGetBox()
Input: pixac
index (caller's view of index within pixac; includes offset)
accesstype (L_COPY or L_CLONE)
Return: box (if null, not automatically an error), or null on error
Notes:
(1) The @index includes the offset, which must be subtracted
to get the actual index into the ptr array.
(2) There is always a boxa with a pixac, and it is initialized so
that each box ptr is NULL.
(3) In general, we expect that there is either a box associated
with each pixc, or no boxes at all in the boxa.
(4) Having no boxes is thus not an automatic error. Whether it
is an actual error is determined by the calling program.
If the caller expects to get a box, it is an error; see, e.g.,
pixacGetBoxGeometry().
pixacompGetBoxGeometry
l_int32 pixacompGetBoxGeometry ( PIXAC *pixac, l_int32 index, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph )
pixacompGetBoxGeometry()
Input: pixac
index (caller's view of index within pixac; includes offset)
&x, &y, &w, &h (<optional return>; each can be null)
Return: 0 if OK, 1 on error
Notes:
(1) The @index includes the offset, which must be subtracted
to get the actual index into the ptr array.
pixacompGetBoxa
BOXA * pixacompGetBoxa ( PIXAC *pixac, l_int32 accesstype )
pixacompGetBoxa()
Input: pixac
accesstype (L_COPY, L_CLONE, L_COPY_CLONE)
Return: boxa, or null on error
pixacompGetBoxaCount
l_int32 pixacompGetBoxaCount ( PIXAC *pixac )
pixacompGetBoxaCount()
Input: pixac
Return: count, or 0 on error
pixacompGetCount
l_int32 pixacompGetCount ( PIXAC *pixac )
pixacompGetCount()
Input: pixac
Return: count, or 0 if no pixa
pixacompGetOffset
l_int32 pixacompGetOffset ( PIXAC *pixac )
pixacompGetOffset()
Input: pixac
Return: offset, or 0 on error
Notes:
(1) The offset is the difference between the caller's view of
the index into the array and the actual array index.
By default it is 0.
pixacompGetPix
PIX * pixacompGetPix ( PIXAC *pixac, l_int32 index )
pixacompGetPix()
Input: pixac
index (caller's view of index within pixac; includes offset)
Return: pix, or null on error
Notes:
(1) The @index includes the offset, which must be subtracted
to get the actual index into the ptr array.
pixacompGetPixDimensions
l_int32 pixacompGetPixDimensions ( PIXAC *pixac, l_int32 index, l_int32 *pw, l_int32 *ph, l_int32 *pd )
pixacompGetPixDimensions()
Input: pixa
index (caller's view of index within pixac; includes offset)
&w, &h, &d (<optional return>; each can be null)
Return: 0 if OK, 1 on error
Notes:
(1) The @index includes the offset, which must be subtracted
to get the actual index into the ptr array.
pixacompGetPixcomp
PIXC * pixacompGetPixcomp ( PIXAC *pixac, l_int32 index )
pixacompGetPixcomp()
Input: pixac
index (caller's view of index within pixac; includes offset)
Return: pixc, or null on error
Notes:
(1) The @index includes the offset, which must be subtracted
to get the actual index into the ptr array.
(2) Important: this is just a ptr to the pixc owned by the pixac.
Do not destroy unless you are replacing the pixc.
pixacompRead
PIXAC * pixacompRead ( const char *filename )
pixacompRead()
Input: filename
Return: pixac, or null on error
Notes:
(1) Unlike the situation with serialized Pixa, where the image
data is stored in png format, the Pixacomp image data
can be stored in tiffg4, png and jpg formats.
pixacompReadStream
PIXAC * pixacompReadStream ( FILE *fp )
pixacompReadStream()
Input: stream
Return: pixac, or null on error
pixacompReplacePix
l_int32 pixacompReplacePix ( PIXAC *pixac, l_int32 index, PIX *pix, l_int32 comptype )
pixacompReplacePix()
Input: pixac
index (caller's view of index within pixac; includes offset)
pix (owned by the caller)
comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
Return: 0 if OK; 1 on error
Notes:
(1) The @index includes the offset, which must be subtracted
to get the actual index into the ptr array.
(2) The input @pix is converted to a pixc, which is then inserted
into the pixac.
pixacompReplacePixcomp
l_int32 pixacompReplacePixcomp ( PIXAC *pixac, l_int32 index, PIXC *pixc )
pixacompReplacePixcomp()
Input: pixac
index (caller's view of index within pixac; includes offset)
pixc (to replace existing one, which is destroyed)
Return: 0 if OK; 1 on error
Notes:
(1) The @index includes the offset, which must be subtracted
to get the actual index into the ptr array.
(2) The inserted @pixc is now owned by the pixac. The caller
must not destroy it.
pixacompSetOffset
l_int32 pixacompSetOffset ( PIXAC *pixac, l_int32 offset )
pixacompSetOffset()
Input: pixac
offset (non-negative)
Return: 0 if OK, 1 on error
Notes:
(1) The offset is the difference between the caller's view of
the index into the array and the actual array index.
By default it is 0.
pixacompWrite
l_int32 pixacompWrite ( const char *filename, PIXAC *pixac )
pixacompWrite()
Input: filename
pixac
Return: 0 if OK, 1 on error
Notes:
(1) Unlike the situation with serialized Pixa, where the image
data is stored in png format, the Pixacomp image data
can be stored in tiffg4, png and jpg formats.
pixacompWriteStream
l_int32 pixacompWriteStream ( FILE *fp, PIXAC *pixac )
pixacompWriteStream()
Input: stream
pixac
Return: 0 if OK, 1 on error
pixacompWriteStreamInfo
l_int32 pixacompWriteStreamInfo ( FILE *fp, PIXAC *pixac, const char *text )
pixacompWriteStreamInfo()
Input: fp (file stream)
pixac
text (<optional> identifying string; can be null)
Return: 0 if OK, 1 on error
pixcompCreateFromFile
PIXC * pixcompCreateFromFile ( const char *filename, l_int32 comptype )
pixcompCreateFromFile()
Input: filename
comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
Return: pixc, or null on error
Notes:
(1) Use @comptype == IFF_DEFAULT to have the compression
type automatically determined.
(2) If the comptype is invalid for this file, the default will
be substituted.
pixcompCreateFromPix
PIXC * pixcompCreateFromPix ( PIX *pix, l_int32 comptype )
pixcompCreateFromPix()
Input: pix
comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
Return: pixc, or null on error
Notes:
(1) Use @comptype == IFF_DEFAULT to have the compression
type automatically determined.
pixcompCreateFromString
PIXC * pixcompCreateFromString ( l_uint8 *data, size_t size, l_int32 copyflag )
pixcompCreateFromString()
Input: data (compressed string)
size (number of bytes)
copyflag (L_INSERT or L_COPY)
Return: pixc, or null on error
Notes:
(1) This works when the compressed string is png, jpeg or tiffg4.
(2) The copyflag determines if the data in the new Pixcomp is
a copy of the input data.
pixcompDestroy
void pixcompDestroy ( PIXC **ppixc )
pixcompDestroy()
Input: &pixc <will be nulled>
Return: void
Notes:
(1) Always nulls the input ptr.
pixcompDetermineFormat
l_int32 pixcompDetermineFormat ( l_int32 comptype, l_int32 d, l_int32 cmapflag, l_int32 *pformat )
pixcompDetermineFormat()
Input: comptype (IFF_DEFAULT, IFF_TIFF_G4, IFF_PNG, IFF_JFIF_JPEG)
d (pix depth)
cmapflag (1 if pix to be compressed as a colormap; 0 otherwise)
&format (return IFF_TIFF, IFF_PNG or IFF_JFIF_JPEG)
Return: 0 if OK; 1 on error
Notes:
(1) This determines the best format for a pix, given both
the request (@comptype) and the image characteristics.
(2) If @comptype == IFF_DEFAULT, this does not necessarily result
in png encoding. Instead, it returns one of the three formats
that is both valid and most likely to give best compression.
(3) If the pix cannot be compressed by the input value of
@comptype, this selects IFF_PNG, which can compress all pix.
pixcompGetDimensions
l_int32 pixcompGetDimensions ( PIXC *pixc, l_int32 *pw, l_int32 *ph, l_int32 *pd )
pixcompGetDimensions()
Input: pixc
&w, &h, &d (<optional return>)
Return: 0 if OK, 1 on error
pixcompWriteStreamInfo
l_int32 pixcompWriteStreamInfo ( FILE *fp, PIXC *pixc, const char *text )
pixcompWriteStreamInfo()
Input: fp (file stream)
pixc
text (<optional> identifying string; can be null)
Return: 0 if OK, 1 on error
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.