Я пытаюсь прочитать отсканированное изображение и сжать его из 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);
}