C ++ LibTiff - 从内存中读取和保存文件

时间:2011-01-07 09:35:18

标签: c++ memory libtiff

LibTiff中有没有办法从内存中读取文件并将其保存到内存中?

在使用其他库打开图像之前,我不想先将图像保存到光盘......

非常感谢!

2 个答案:

答案 0 :(得分:15)

我知道这是一个老问题,但我会为像我这样的人发布一个更简单,更新的答案,他们需要这些信息用于更新版本的libtiff。在最新版本的libtiff(4.0.2)中,甚至我认为的过去几个版本(检查您的特定版本号),都有一个名为tiffio.hxx的包含文件。它有两个外部函数用于读/写内存中的流:

extern TIFF* TIFFStreamOpen(const char*, std::ostream *);
extern TIFF* TIFFStreamOpen(const char*, std::istream *);

您可以只包含此文件并读取或写入内存。

写作示例:

#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);

这些是非常简单的示例,但您可以看到,通过使用TIFFStreamOpen,您不必覆盖这些函数并将它们传递给TIFFClientOpen。​​

答案 1 :(得分:6)

您应该创建自己的读/写/等。功能,并在创建TIFFClientOpen时将其传递给TIFFOpen(非TIFF)功能。

示例:

TIFF* tif = TIFFClientOpen(
    "Memory", "w", (thandle_t)something_you_will_use_later,
    tiff_Read, tiff_Write, tiff_Seek, tiff_Close, tiff_Size,
    tiff_Map, tiff_Unmap);

您还应该实现以下功能(传递给这些功能的st是传递给something_you_will_use_later的{​​{1}}:

TIFFClientOpen