2012-08-14 19 views
7

Ich weiß, thumbnail.c enthält einige Code, der ein Thumbnail erstellt und es in einem Sub IDF, aber es gibt eine Menge in diesem Code (das Erstellen des Thumbnails, Anwenden einer Kontrastkurve, etc.) und ich habe Schwierigkeiten, nur ein Thumbnail zu schreiben. Google war auch keine Hilfe.In einem TIFF erstellen ein Sub IFD mit Thumbnail (libtiff)

Meine Frage ist, nachdem ich eine Ausgabedatei geöffnet haben und ein TIFF * habe, habe ich meine Miniaturbilddaten alle bereit (Daten sowie meine Hauptbild) zu gehen, wie kann ich sie so hinzufügen, dass Das Thumbnail befindet sich in einer Sub-IFD des Hauptbild-IFD?

Antwort

5

So nach für eine Weile durch die libtiff Quellcode zu graben, ich über diese in tif_dirwrite.c gestolpert:

/* 
* Copyright (c) 1988-1997 Sam Leffler 
* Copyright (c) 1991-1997 Silicon Graphics, Inc. 
* 
* Permission to use, copy, modify, distribute, and sell this software and 
* its documentation for any purpose is hereby granted without fee, provided 
* that (i) the above copyright notices and this permission notice appear in 
* all copies of the software and related documentation, and (ii) the names of 
* Sam Leffler and Silicon Graphics may not be used in any advertising or 
* publicity relating to the software without the specific, prior written 
* permission of Sam Leffler and Silicon Graphics. 
*/ 

... 
if (!n) 
    return(0); 
/* 
* Total hack: if this directory includes a SubIFD 
* tag then force the next <n> directories to be 
* written as ``sub directories'' of this one. This 
* is used to write things like thumbnails and 
* image masks that one wants to keep out of the 
* normal directory linkage access mechanism. 
*/ 
tif->tif_flags|=TIFF_INSUBIFD; 
tif->tif_nsubifd=tif->tif_dir.td_nsubifd; 
if (tif->tif_dir.td_nsubifd==1) 
    tif->tif_subifdoff=0; 
else 
    tif->tif_subifdoff=m; 
return(1); 
... 

(ich die Copyright-Informationen enthalten, weil ich nicht sicher war, ob ich musste, wenn

//... 
//For the sake of this demo we will assume that I have opened a 
//TIFF (TIFF* created_TIFF) in write mode and have included the correct header 
//files 

//set all of your TIFF fields for the main image 
//... 

//Define the number of sub-IFDs you are going to write 
//(assuming here that we are only writing one thumbnail for the image): 
int number_of_sub_IFDs = 1; 
toff_t sub_IFDs_offsets[1] = { 0UL }; 

//set the TIFFTAG_SUBIFD field: 
if(!TIFFSetField(created_TIFF, TIFFTAG_SUBIFD, number_of_sub_IFDs, 
    sub_IFDs_offsets)) 
{ 
    //there was an error setting the field 
} 

//Write your main image raster data to the TIFF (using whatever means you need, 
//such as TIFFWriteRawStrip, TIFFWriteEncodedStrip, TIFFWriteEncodedTile, etc.) 
//... 

//Write your main IFD like so: 
TIFFWriteDirectory(created_TIFF); 

//Now here is the trick: like the comment in the libtiff source states, the 
//next n directories written will be sub-IFDs of the main IFD (where n is 
//number_of_sub_IFDs specified when you set the TIFFTAG_SUBIFD field) 

//Set up your sub-IFD 
if(!TIFFSetField(created_TIFF, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE)) 
{ 
    //there was an error setting the field 
} 

//set the rest of the required tags here, as well as any extras you would like 
//(remember, these refer to the thumbnail, not the main image) 
//... 

//Write this sub-IFD: 
TIFFWriteDirectory(created_TIFF); 

//Assuming you are only writing one sub-IFD and are done with the file, you 
//can close it now. If you specified more than one sub-IFD, you need repeat 
//the above code (starting where we set TIFFTAG_SUBFILETYPE) for each of your 
//sub-IFDs 
TIFFClose(created_TIFF); 

ich hoffe, dass: Code aus der Bibliothek veröffentlicht hier)

Also, meine eigene Frage zu beantworten (wie eine Miniaturansicht in einem Teil IFD des Hauptbild IFD) zu schreiben Das hilft jemandem und dass sie nicht so viel Kraft aufwenden müssen wie ich, um herauszufinden, wie das geht. Es ist wirklich eine Schande, dass libtiff so schlecht dokumentiert ist, besonders wenn man bedenkt, wie weit es benutzt wird.