Запись 16-битного одноканального изображения в Tiff

Я пытаюсь сохранить изображение в формате TIFF. Я использовал libraw для чтения необработанных данных с камеры, и это дает мне короткие данные без знака. Я выполнил некоторую операцию с данными и хочу сохранить результат в виде 16-битного изображения в градациях серого (1 канал) в формате файла Tiff. Но результат — просто пустое изображение. Даже если я использую буфер, который сохраняет исходное изображение байера, он не будет сохранен правильно. Это код, который я использую для сохранения:

// Open the TIFF file
if((output_image = TIFFOpen("image.tiff", "w")) == NULL){
std::cerr << "Unable to write tif file: " << "image.tiff" << std::endl;
}

TIFFSetField(output_image, TIFFTAG_IMAGEWIDTH, width());
TIFFSetField(output_image, TIFFTAG_IMAGELENGTH, height());
TIFFSetField(output_image, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(output_image, TIFFTAG_BITSPERSAMPLE, 16);
TIFFSetField(output_image, TIFFTAG_ROWSPERSTRIP, 1);
TIFFSetField(output_image, TIFFTAG_ORIENTATION, (int)ORIENTATION_TOPLEFT);
TIFFSetField(output_image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(output_image, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
TIFFSetField(output_image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);// Write the information to the file

tsize_t image_s;
if( (image_s = TIFFWriteEncodedStrip(output_image, 0, &m_data_cropped[0], width()*height())) == -1)
{
std::cerr << "Unable to write tif file: " << "image.tif" << std::endl;
}
else
{
std::cout << "Image is saved! size is : " << image_s << std::endl;
}

TIFFWriteDirectory(output_image);
TIFFClose(output_image);

1

Решение

Похоже, у вас есть две проблемы в вашем коде.

  1. Вы пытаетесь написать целое изображение одним вызовом TIFFWriteEncodedStrip но в то же время настройка TIFFTAG_ROWSPERSTRIP в 1 (вы должны установить его на height() в таких случаях).

  2. Вы передаете неправильные значения TIFFWriteEncodedStrip, Последний параметр — длина полосы в байтах, и вы явно проходите длину в пикселях.

Я не уверен, что &m_data_cropped[0] параметр указывает на первый байт все изображение, так что вы можете проверить правильность этого параметра тоже.

2

Другие решения

Других решений пока нет …