added ifd offset to the tiff decoder args, call TIFFSetSubDirectory

This commit is contained in:
Kenny Ostrom 2014-08-21 13:02:01 -05:00 committed by wiredfool
parent 99f7dd2aff
commit d5b4f136c5
4 changed files with 22 additions and 8 deletions

View File

@ -281,6 +281,7 @@ class ImageFileDirectory(collections.MutableMapping):
self.tagdata = {} self.tagdata = {}
self.tagtype = {} # added 2008-06-05 by Florian Hoech self.tagtype = {} # added 2008-06-05 by Florian Hoech
self.next = None self.next = None
self.offset = None
def __str__(self): def __str__(self):
return str(self.as_dict()) return str(self.as_dict())
@ -415,6 +416,7 @@ class ImageFileDirectory(collections.MutableMapping):
# load tag dictionary # load tag dictionary
self.reset() self.reset()
self.offset = fp.tell()
i16 = self.i16 i16 = self.i16
i32 = self.i32 i32 = self.i32
@ -708,6 +710,7 @@ class TiffImageFile(ImageFile.ImageFile):
# (self._compression, (extents tuple), # (self._compression, (extents tuple),
# 0, (rawmode, self._compression, fp)) # 0, (rawmode, self._compression, fp))
ignored, extents, ignored_2, args = self.tile[0] ignored, extents, ignored_2, args = self.tile[0]
args = args + (self.ifd.offset,)
decoder = Image._getdecoder(self.mode, 'libtiff', args, decoder = Image._getdecoder(self.mode, 'libtiff', args,
self.decoderconfig) self.decoderconfig)
try: try:

View File

@ -442,8 +442,9 @@ PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args)
char* rawmode; char* rawmode;
char* compname; char* compname;
int fp; int fp;
int ifdoffset;
if (! PyArg_ParseTuple(args, "sssi", &mode, &rawmode, &compname, &fp)) if (! PyArg_ParseTuple(args, "sssii", &mode, &rawmode, &compname, &fp, &ifdoffset))
return NULL; return NULL;
TRACE(("new tiff decoder %s\n", compname)); TRACE(("new tiff decoder %s\n", compname));
@ -455,7 +456,7 @@ PyImaging_LibTiffDecoderNew(PyObject* self, PyObject* args)
if (get_unpacker(decoder, mode, rawmode) < 0) if (get_unpacker(decoder, mode, rawmode) < 0)
return NULL; return NULL;
if (! ImagingLibTiffInit(&decoder->state, fp)) { if (! ImagingLibTiffInit(&decoder->state, fp, ifdoffset)) {
Py_DECREF(decoder); Py_DECREF(decoder);
PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed"); PyErr_SetString(PyExc_RuntimeError, "tiff codec initialization failed");
return NULL; return NULL;

View File

@ -21,8 +21,8 @@
#include "TiffDecode.h" #include "TiffDecode.h"
void dump_state(const TIFFSTATE *state){ void dump_state(const TIFFSTATE *state){
TRACE(("State: Location %u size %d eof %d data: %p \n", (uint)state->loc, TRACE(("State: Location %u size %d eof %d data: %p ifd: %d\n", (uint)state->loc,
(int)state->size, (uint)state->eof, state->data)); (int)state->size, (uint)state->eof, state->data, state->ifd));
} }
/* /*
@ -142,7 +142,7 @@ void _tiffUnmapProc(thandle_t hdata, tdata_t base, toff_t size) {
(void) hdata; (void) base; (void) size; (void) hdata; (void) base; (void) size;
} }
int ImagingLibTiffInit(ImagingCodecState state, int fp) { int ImagingLibTiffInit(ImagingCodecState state, int fp, int offset) {
TIFFSTATE *clientstate = (TIFFSTATE *)state->context; TIFFSTATE *clientstate = (TIFFSTATE *)state->context;
TRACE(("initing libtiff\n")); TRACE(("initing libtiff\n"));
@ -158,6 +158,7 @@ int ImagingLibTiffInit(ImagingCodecState state, int fp) {
clientstate->size = 0; clientstate->size = 0;
clientstate->data = 0; clientstate->data = 0;
clientstate->fp = fp; clientstate->fp = fp;
clientstate->ifd = offset;
clientstate->eof = 0; clientstate->eof = 0;
return 1; return 1;
@ -195,7 +196,6 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int
clientstate->loc = 0; clientstate->loc = 0;
clientstate->data = (tdata_t)buffer; clientstate->data = (tdata_t)buffer;
clientstate->flrealloc = 0; clientstate->flrealloc = 0;
dump_state(clientstate); dump_state(clientstate);
TIFFSetWarningHandler(NULL); TIFFSetWarningHandler(NULL);
@ -220,6 +220,16 @@ int ImagingLibTiffDecode(Imaging im, ImagingCodecState state, UINT8* buffer, int
return -1; return -1;
} }
if (clientstate->ifd){
unsigned int ifdoffset = clientstate->ifd;
TRACE(("reading tiff ifd %d\n", ifdoffset));
int rv = TIFFSetSubDirectory(tiff, ifdoffset);
if (!rv){
TRACE(("error in TIFFSetSubDirectory"));
return -1;
}
}
size = TIFFScanlineSize(tiff); size = TIFFScanlineSize(tiff);
TRACE(("ScanlineSize: %d \n", size)); TRACE(("ScanlineSize: %d \n", size));
if (size > state->bytes) { if (size > state->bytes) {

View File

@ -26,6 +26,7 @@ typedef struct {
toff_t loc; /* toff_t == uint32 */ toff_t loc; /* toff_t == uint32 */
tsize_t size; /* tsize_t == int32 */ tsize_t size; /* tsize_t == int32 */
int fp; int fp;
int ifd; /* offset of the ifd, used for multipage */
TIFF *tiff; /* Used in write */ TIFF *tiff; /* Used in write */
toff_t eof; toff_t eof;
int flrealloc; /* may we realloc */ int flrealloc; /* may we realloc */
@ -33,7 +34,7 @@ typedef struct {
extern int ImagingLibTiffInit(ImagingCodecState state, int fp); extern int ImagingLibTiffInit(ImagingCodecState state, int fp, int offset);
extern int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp); extern int ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp);
extern int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...); extern int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...);
@ -50,5 +51,4 @@ extern int ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...);
#define TRACE(args) #define TRACE(args)
#endif #endif