2

画像を取得して TIFF ファイルに書き込むプログラムがあります。イメージは、グレー スケール (8 ビット)、アルファ チャネル付きグレー スケール (16 ビット)、RGB (24 ビット)、または ARGB (32 ビット) のいずれかです。アルファ チャンネルなしで画像を書き出すのに問題はありませんが、アルファ付きの画像の場合、余分なサンプル タグを設定しようとすると、TIFFSetErrorHandler によって設定された TIFF エラー処理ルーチンに送られます。渡されるメッセージは<filename>: Bad value 1 for "ExtraSamples"、_TIFFVSetField モジュールにあります。以下のサンプルコード:

#include "tiff.h"
#include "tiffio.h"
#include "xtiffio.h"
//Other includes

class MyTIFFWriter
{
public:
    MyTIFFWriter(void);

    ~MyTIFFWriter(void);

    bool writeFile(MyImage* outputImage);
    bool openFile(std::string filename);
    void closeFile();

private:
    TIFF* m_tif;
};

//...

bool MyTIFFWriter::writeFile(MyImage* outputImage)
{
    // check that we have data and that the tiff is ready for writing
    if (outputImage->getHeight() == 0 || outputImage->getWidth() == 0 || !m_tif)
        return false;

    TIFFSetField(m_tif, TIFFTAG_IMAGEWIDTH, outputImage->getWidth());
    TIFFSetField(m_tif, TIFFTAG_IMAGELENGTH, outputImage->getHeight());
    TIFFSetField(m_tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
    TIFFSetField(m_tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);

    if (outputImage->getColourMode() == MyImage::ARGB)
    {
        TIFFSetField(m_tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
        TIFFSetField(m_tif, TIFFTAG_BITSPERSAMPLE, outputImage->getBitDepth() / 4);
        TIFFSetField(m_tif, TIFFTAG_SAMPLESPERPIXEL, 4);
        TIFFSetField(m_tif, TIFFTAG_EXTRASAMPLES, EXTRASAMPLE_ASSOCALPHA);  //problem exists here
    } else if (/*other mode*/)
        //apply other mode settings

    //...

    return (TIFFWriteEncodedStrip(m_tif, 0, outputImage->getImgDataAsCharPtr(), 
        outputImage->getWidth() * outputImage->getHeight() *
        (outputImage->getBitDepth() / 8)) != -1);
}

私が見る限り、タグはファイルに書き込まれません。幸いなことに、GIMP はまだ追加チャンネルがアルファ版であることを認識していますが、これらの TIFF を読み取る必要のある他のプログラムはそれほど寛大ではありません。TIFFTAG_EXTRASAMPLES の前に設定する必要があるタグがありませんか? そこに必要な他のタグがありませんか? どんな助けでも大歓迎です。

4

2 に答える 2

4

解決策を見つけました。Extra_Samples フィールドは uint16 ではなく、最初にカウント (uint16)、次にそのサイズの配列 (uint16 型) です。したがって、呼び出しは次のようになります。

uint16 out[1];
out[0] = EXTRASAMPLE_ASSOCALPHA;

TIFFSetField( outImage, TIFFTAG_EXTRASAMPLES, 1, &out );

これは、複数の追加サンプルが許可されているためです。

お役に立てれば!

乾杯、カスパー

于 2010-09-09T08:36:04.517 に答える