Как мне взять DIB и преобразовать его в TIF с помощью libtiff - PullRequest
1 голос
/ 15 июня 2009

Я пытаюсь прочитать отсканированное изображение и сжать его из DIB в памяти в файл TIF. Я пользуюсь библиотекой libtiff и нашел несколько примеров в Интернете, но ни один из них не делает так, как мне нужно. Мне нужно взять изображение из DIB и превратить его в черно-белое изображение.

Вот код, который я изменил из онлайн-примера. Он превращает его в черно-белый, но также показывает только один фрагмент сканирования, а не весь объект. Любая помощь будет оценена.

РЕДАКТИРОВАТЬ *: я заметил, что это происходит, если я сканирую его как серое изображение, если я сканирую его как черно-белое изображение, то возвращаемое изображение полностью черное, я не знаю, помогает ли это в все.

// set up the image tags 
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, w);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, h);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1);
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(tif, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);

unsigned char * psrc = (unsigned char *)lpBits;
unsigned char * pdst = new unsigned char[(w)];

UINT32 src_index;
UINT32 dst_index;

// now go line by line to write out the image data
for (unsigned int row = 0; row < h; row++ )
{

    // initialize the scan line to zero
    memset(pdst,0,(size_t)(w));

    // moving the data from the dib to a row structure that
    // can be used by the tiff library
    for (unsigned int col = 0; col < w; col++){
        src_index = (h - row - 1) * total_width * bytecount
                                  + col * bytecount;
        dst_index = col;
        pdst[dst_index++] = psrc[src_index+2];
        pdst[dst_index++] = psrc[src_index+1];
        pdst[dst_index] = psrc[src_index];
        result++;
    }

    // now actually write the row data
    TIFFWriteScanline(tif, pdst, row, 0);
}

1 Ответ

0 голосов
/ 15 июня 2009

Я могу ошибаться, но я думаю, что для кодирования CCITTFAX4 libtiff ожидает восемь пикселей на байт, дополняемый до конца байта, если ширина изображения не делится на 8.

Если ширина изображения равна 150, например, строка сканирования должна быть 19 байтов, а не 150.

Есть хороший пример использования libtiff здесь , хотя он не включает в себя обрезание информации о цвете на пороге и упаковку пикселей по 8 на байт.

...