15

LibTiffに、メモリからファイルを読み取ってメモリに保存する方法はありますか?

他のライブラリで開く前に、最初に画像をディスクに保存したくありません...

本当にありがとう!

4

3 に答える 3

22

これは古い質問であることは承知していますが、最近のバージョンの libtiff についてこの情報が必要な私のような人のために、より簡単で最新の回答を投稿します。libtiff (4.0.2) の最新バージョン、および私が信じている過去のいくつかのバージョン (特定のバージョン番号を確認してください) には、tiffio.hxx という名前のインクルード ファイルがあります。メモリ内のストリームを読み書きするための 2 つの extern 関数があります。

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 に渡す必要がないことがわかります。

于 2012-08-10T20:57:27.333 に答える
7

独自の読み取り/書き込み/その他を作成する必要があります。関数を作成し、それらをTIFFClientOpen(not 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渡されTIFFClientOpenます:

tsize_t tiff_Read(thandle_t st,tdata_t buffer,tsize_t size)
{
    ...
};

tsize_t tiff_Write(thandle_t st,tdata_t buffer,tsize_t size)
{
    ...
};

int tiff_Close(thandle_t)
{
    return 0;
};

toff_t tiff_Seek(thandle_t st,toff_t pos, int whence)
{
    if (pos == 0xFFFFFFFF)
       return 0xFFFFFFFF;
    ...
};

toff_t tiff_Size(thandle_t st)
{
    ...
};

int tiff_Map(thandle_t, tdata_t*, toff_t*)
{
    return 0;
};

void tiff_Unmap(thandle_t, tdata_t, toff_t)
{
    return;
};
于 2011-01-07T12:58:48.617 に答える