2012-08-14 8 views
7

Wiem, że thumbnail.c zawiera kod, który tworzy miniaturkę i umieszcza ją w podfolderze IDF, ale w tym kodzie dzieje się dużo (generowanie miniatury, zastosowanie krzywej kontrastu itp.) i mam problem z odtwarzaniem tylko pisania miniatury. Google też nie było pomocne.W pliku TIFF utwórz Sub IFD z miniaturą (libtiff)

Moje pytanie brzmi, po tym jak otworzyłem plik wyjściowy i mam TIFF *, mam wszystkie dane miniaturki gotowe do pracy (jak również moje główne dane obrazu), jak mogę je dodać w taki sposób, aby miniatura jest w podrzędnej IFD głównego obrazu IFD?

Odpowiedz

5

Więc po kopanie wokół poprzez kod źródłowy libtiff na chwilę, natknąłem się to w tif_dirwrite.c:

/* 
* 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); 
... 

(I obejmowała informacje o prawach autorskich, bo nie był pewien, czy miałem kiedy opublikowania kodu z biblioteki tutaj)

Tak więc, aby odpowiedzieć na moje własne pytanie (jak napisać miniaturę w sub-IFD głównego obrazu IFD):

//... 
//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); 

mam nadzieję, że to pomaga komuś i że nie muszą poświęcać tak dużo wysiłku, jak ja, aby dowiedzieć się, jak to zrobić. Szkoda, że ​​libtiff jest tak źle udokumentowany, zwłaszcza biorąc pod uwagę, jak szeroko jest on wykorzystywany.

Powiązane problemy