C++ 使用libtiff';s TIFFREADRAWDILE,无需解压缩/压缩即可获得jpeg图像块

C++ 使用libtiff';s TIFFREADRAWDILE,无需解压缩/压缩即可获得jpeg图像块,c++,libjpeg,libtiff,C++,Libjpeg,Libtiff,我有一个金字塔平铺的tiff文件,我想在不解码和重新编码jpeg的情况下提取平铺,我已经看到使用TIFFReadRawTile()函数可以在不解码的情况下提取原始平铺,如何将提取的缓冲区写入可读的jpeg文件?您要完成的任务不是一个简单的任务。您可能需要仔细查看tiff2pdf实用程序的源代码。该实用程序执行您需要的操作,您可以从中提取相关部分 问题是,该实用程序执行许多其他您必须放弃的操作。此外,该实用程序无法成功处理TIFF中的任何JPEG。基本上,因为那里有足够多的半破损tiff。我发现,

我有一个金字塔平铺的tiff文件,我想在不解码和重新编码jpeg的情况下提取平铺,我已经看到使用TIFFReadRawTile()函数可以在不解码的情况下提取原始平铺,如何将提取的缓冲区写入可读的jpeg文件?

您要完成的任务不是一个简单的任务。您可能需要仔细查看tiff2pdf实用程序的源代码。该实用程序执行您需要的操作,您可以从中提取相关部分


问题是,该实用程序执行许多其他您必须放弃的操作。此外,该实用程序无法成功处理TIFF中的任何JPEG。基本上,因为那里有足够多的半破损tiff。

我发现,实际上,如果不直接干扰tiff的huffmann表,就无法获得编码的tiff,这是相当棘手的

我发现的唯一方法是读取解码的磁贴,然后对VIP进行一些魔术处理,直接输出到jpeg

tdata_t buf;
tsize_t len;

buf = _TIFFmalloc( TIFFTileSize( tif ) );
len = TIFFReadEncodedTile(tif, tile, buf, (tsize_t) -1);

VImage result ((void *) buf, 256, 256, 3, VImage::FMTUCHAR);

void *outBuffer;
unsigned long len;
vips_jpegsave_buffer(result, &outBuffer, &len, "Q", 90, NULL);

使用cout在一些标题后输出图像。

让我检查一下tiff2pdf源代码,顺便说一句,TIFF中的JPEG总是由我使用vips2tiff命令生成的,因此它总是以相同的格式转换。事实上,我刚刚将TiffReadEncodedFile()用于VIP图像,但如果可能的话,我想跳过解码/编码部分不幸的是,我对vips2tiff一无所知,所以我不能说这是否是比tiff2pdf更好的起点。别担心,只是TiffReadEncodedFile解码JPEG,原始版本返回编码的JPEG,但我认为您需要添加一些JPEG元数据