- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我知道 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/
我正在尝试使用 Microsoft Visual Studio 2017 构建 C++ 程序。 #include "stdafx.h" #include #include #include #i
在 LibTiff 中有没有办法从内存中读取文件并将其保存到内存中? 我不想先将图像保存到光盘,然后再用其他库打开它... 非常感谢! 最佳答案 我知道这是一个老问题,但我将为像我这样需要此信息以获取
我正在尝试在 VS2012 x64 上使用 libtiff 4.0.3,但我的代码出现错误: 代码如下: long SaveTIFF(wchar_t *filePathAndName, char *
首先是一个简短的免责声明:我刚刚开始使用 C++ 编程,并且刚刚开始使用 Linux (Ubuntu) 进行开发。如果是我,我会推迟这件事,但我不能。是时候学习新东西了! 范围:我需要开发一个软件来对
如何在我的 makefile 中指定我想与 libtiff 库链接。仅在 LDFLAGS 中指定 -ltiff 是行不通的。 最佳答案 您可以使用 -L 标志(请参阅编译器手册 - 我假设您使用的是
我正在尝试将 TIFF 图像存档在数据库中,并且我想尽可能地压缩图像,即使以更高的 CPU 使用率和高内存为代价。 为了测试 LibTiff.NET 中可用的压缩,我使用了以下代码(修改自 this
我正在尝试更改现有 TIFF 图像中一些自定义 ASCII 标签的值,如 http://bitmiracle.com/libtiff/help/add-custom-tiff-tags-to-an-e
是否可以通过逐像素迭代并为每个像素设置 RGB 值来创建新的 tif? 让我解释一下我正在尝试做什么。我正在尝试打开现有的 tif,使用 TIFFReadRGBAImage 读取它,获取 TIFFGe
我读了here LibTIFF 可以显示浮点 TIFF。但是,我想加载图像,然后将浮点值作为数组获取。 使用 LibTIFF 可以做到这一点吗? Example TIFF 编辑:我正在使用 RHEL
我正在尝试让 libtiff 使用方法TIFFReadScanline(tif, buf, row) 读出包含一条约 500x500 32 位像素的 tiff 文件。这给了我 tdata_t (??)
Libtiff 是一个 C 库,但我想将它与 Qt Creator 中的 C++ 项目一起使用。有谁知道如何做到这一点?当我尝试使用 C 库时遇到编译时错误,所以我不确定该怎么做。 我得到的编译时错误
我正在使用 LibTiff v4.0.3。 我让它在多字节中工作得很好,但是当我尝试使用 Unicode 时,我遇到了运行时异常。 我可以将问题简化为一行: #include "tiffio.h" i
我正在尝试使用 LibTIFF 在多页 tiff(金字塔形 tiff)上编写图 block : for(int pageNum=0; pageNum0) { TIFFWriteDire
我制作了一个需要 libtiff 模块才能运行的 Python 脚本。您对如何安装 libtiff 有什么建议吗?我尝试使用 fink 来完成它,但出现以下错误: Failed: no package
我尝试在 Ubuntu 13.04 64 位中构建 Qt-opencv 应用程序,但它不断警告“libtiff.so.4,/usr/local/lib/libopencv_highgui.so 需要,
我目前正在开展一个项目,该项目要求我将一个 TIFF 图像拆分为一个包含所有标签的文件和一个包含所有图像数据的文件,并从这些文件重建一个 TIFF 图像。唯一的问题是 LibTIFF 似乎没有提供从图
我想使用 LibTiff 和 XE3 来访问 TIFF 文件中的图像元数据信息。 我需要找到 tiff 中的页数及其大小。我建议使用 LibTiff,因为我需要尽可能最快地实现读取 tiff 图像元数
所以我有这个程序,但尚未完成。我的图像将是 8 位或 16 位。如何将 buf 中的任何值分配给缓冲区数组?现在, buf 之后的 printf 不起作用,因为它说 buf 的类型为 void*...
您好,我找不到将多页 tiff 图像转换为字节数组的示例。 为了将字节数组转换为 Tiff,我使用这种方法 public static Tiff CreateTiffFromBytes(byt
我知道 thumbnail.c 包含一些创建缩略图并将其放置在子 IDF 中的代码,但该代码中发生了很多事情(生成缩略图、应用对比度曲线等),我有只写缩略图很难重现。 Google 也没有提供任何帮助
我是一名优秀的程序员,十分优秀!