gpt4 book ai didi

c++ - 在 TIFF 中创建一个带有缩略图的子 IFD (libtiff)

转载 作者:可可西里 更新时间:2023-11-01 17:46:20 28 4
gpt4 key购买 nike

我知道 thumbnail.c 包含一些创建缩略图并将其放置在子 IDF 中的代码,但该代码中发生了很多事情(生成缩略图、应用对比度曲线等),我有只写缩略图很难重现。 Google 也没有提供任何帮助。

我的问题是,在我打开一个输出文件并获得 TIFF* 后,我的缩略图数据(以及我的主要图像数据)都已准备就绪,我该如何添加它们才能使缩略图在主图像 IFD 的子 IFD 中?

最佳答案

所以在深入研究 libtiff 源代码一段时间后,我在 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);
...

(我包含了版权信息,因为我不确定在此处从库中发布代码时是否必须这样做)

所以,回答我自己的问题(如何在主图像 IFD 的子 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);

我希望这对某些人有所帮助,并且他们不必像我一样花费太多精力来弄清楚如何做到这一点。 libtiff 的文档记录如此之少真是令人遗憾,尤其是考虑到它的使用范围如此之广。

关于c++ - 在 TIFF 中创建一个带有缩略图的子 IFD (libtiff),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11959617/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com