| AWARE [SYSTEMS] | Imaging expertise for the Delphi developer | |||||||
![]() |
TIFF and LibTiff Mailing List Archive | |||||||
LibTiff Mailing List
TIFF and LibTiff Mailing List Archive Contact
The TIFF Mailing List Homepage |
Thread2008.01.22 10:24 "Re: How to clip an image with LibTiff", by Gerben VosErez.Har-Tal@Walgreens.com wrote:
> We deal with faxes in standard mode (204X98 dpi) or fine mode
> (204X198 dpi) saved with compression of type G3 1D.
> I need to write a utility that clips the first X rows (pixel) from
> the top of the tiff image and last X rows from the bottom of the tiff
> image. We will save it to a new tiff image with G3 compression in the
> height of 2X pixels. The first X rows will be the top of the new image
> and the last X rows will be the bottom of the image. The operation to
> clip the image, should not alter the image nor do any thing that would
> damage the image.
> Is it doable using libtiff on Unix ? Any help and direction will be
> highly appreciated. Doable using other open source libraries ?
Because you know in advance that the input TIFFs will be strip-based
(instead of tile-based) and black-and-white, this is quite easy to do
with libtiff.
You'll get something like this (this is more pseudo-code than real
code, error checking has been omitted):
TIFF *in = TIFFOpen("input.tif", "r");
TIFF *out = TIFFOpen("output.tif", "w");
// Maybe read some headers from "in" to check validity?
// ...
uint32 height;
TIFFGetField(in, TIFFTAG_IMAGELENGTH, &height);
if (height < 2 * x) {
// error out
}
uint32 linesize = TIFFScanlineSize(in);
tdata_t scanline = _TIFFmalloc(linesize);
// Write necessary headers to "out".
TIFFSetField(out, ...);
TIFFSetField(out, TIFFTAG_IMAGELENGTH, 2 * x);
TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX3);
// ...
for (uint32 i = 0; i < x; ++i) {
TIFFReadScanline(in, i, scanline, 0);
TIFFWriteScanline(out, i, scanline, 0);
}
for (uint32 i = height - x; i < height; ++i) {
TIFFReadScanline(in, i, scanline, 0);
TIFFWriteScanline(out, i, scanline, 0);
}
_TIFFfree(scanline);
TIFFClose(in);
TIFFClose(out);
Read the documentation for the exact headers you need to write. Also
look at the included utility programs for inspiration. Obviously, I
haven't tested any of the above code and give no guarantees whatsoever.
Gerben Vos.
|
|||||||