#include <tiffio.h>
#include <tiffio.hxx>
#include <sstream>
std::ostringstream output_TIFF_stream;
//Note: because this is an in memory TIFF, just use whatever you want for the name - we
//aren't using it to read from a file
TIFF* mem_TIFF = TIFFStreamOpen("MemTIFF", &output_TIFF_stream);
//perform normal operations on mem_TIFF here like setting fields
//...
//Write image data to the TIFF
//..
TIFFClose(mem_TIFF);
//Now output_TIFF_stream has all of my image data. I can do whatever I need to with it.
阅读非常相似:
#include <tiffio.h>
#include <tiffio.hxx>
#include <sstream>
std::istringstream input_TIFF_stream;
//Populate input_TIFF_stream with TIFF image data
//...
TIFF* mem_TIFF = TIFFStreamOpen("MemTIFF", &input_TIFF_stream);
//perform normal operations on mem_TIFF here reading fields
//...
TIFFClose(mem_TIFF);
4条答案
按热度按时间7jmck4yq1#
您应该创建自己的读/写/等函数,并在创建
TIFF
时将它们传递给TIFFClientOpen
(而不是TIFFOpen
)函数。示例:
您还应该实现以下函数(传递给这些函数的
st
是传递给TIFFClientOpen
的something_you_will_use_later
:o0lyfsai2#
我使用的是…:
然后:
要使用内存缓冲区:
1rhkuytd3#
我遇到了同样的问题:将TIFF保存为临时文件并重新读取它可以工作,而在内存中读取同一文件并尝试保存或创建cv::Mat失败。原因是读取文件通常会通过_tiffReadProc,它消耗8个字节(在我的情况下是“II*\0\b\0\0\0”)并将它们作为有效的头返回,而从内存中读取则会通过_tiffisReadProc,它只读取3个字节并因无效的头而失败。不知道如何使其工作。填充std::istringstream很容易:std::isstringstream input_TIFF_stream(mem);其中“mem”是char数组。
6ovsh4lw4#
我知道这是一个老问题了,但是对于那些像我一样需要了解libtiff最新版本的人,我将给出一个更简单、更及时的答案。(4.0.2),甚至过去的几个版本我都相信(检查您的特定版本号),有一个名为tiffio. hxx的包含文件。它有两个外部函数用于阅读/写入内存中的流:
您可以只包含此文件并读取或写入内存。
写作示例:
阅读非常相似:
这些都是非常简单的示例,但您可以看到,通过使用TIFFStreamOpen,您不必重写这些函数并将其传递给TIFFClientOpen。