Я пытаюсь сохранить изображение в формате 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);
Похоже, у вас есть две проблемы в вашем коде.
Вы пытаетесь написать целое изображение одним вызовом TIFFWriteEncodedStrip
но в то же время настройка TIFFTAG_ROWSPERSTRIP
в 1
(вы должны установить его на height()
в таких случаях).
Вы передаете неправильные значения TIFFWriteEncodedStrip
, Последний параметр — длина полосы в байтах, и вы явно проходите длину в пикселях.
Я не уверен, что &m_data_cropped[0]
параметр указывает на первый байт все изображение, так что вы можете проверить правильность этого параметра тоже.
Других решений пока нет …