Ошибка при попытке применить тег «ExtraSamples» к файлу TIFF для записи - PullRequest
2 голосов
/ 10 августа 2010

У меня есть программа, которая берет изображение и записывает его в файл TIFF.Изображение может быть серым (8 бит), серым с альфа-каналом (16 бит), RGB (24 бита) или ARGB (32 бита).У меня нет проблем с записью изображений без альфа-канала, но для изображений с альфа-каналом, когда я пытаюсь установить тег дополнительных образцов, меня отправляют в процедуру обработки ошибок TIFF, установленную TIFFSetErrorHandler.Переданное сообщение - <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?Я скучаю по другим тегам, которые должны быть там?Любая помощь будет оценена.

1 Ответ

4 голосов
/ 09 сентября 2010

Я нашел решение. Поле Extra_Samples - это не uint16, а сначала счет (который является uint16), а затем массив этого размера (типа uint16). Таким образом, вызов должен выглядеть следующим образом:

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

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

Причина этого заключается в том, что допускается более одного дополнительного образца.

Надеюсь, это поможет!

Ура, Каспар

...