gpt4 book ai didi

c++ - 如何获取 DIB 并使用 libtiff 将其转换为 tif

转载 作者:太空宇宙 更新时间:2023-11-04 14:28:37 25 4
gpt4 key购买 nike

我正在尝试读取扫描图像并将其从内存中的 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);
}

最佳答案

我可能错了,但我认为对于 CCITTFAX4 编码,libtiff 期望每字节八个像素,如果图像宽度不能被 8 整除,则填充到字节的末尾。

如果图片的宽度是150,例如,扫描线应该是19字节,而不是150。

有一个使用 libtiff 的好例子 here ,尽管它不包括在阈值处切断颜色信息并将像素打包为每字节 8 个。

关于c++ - 如何获取 DIB 并使用 libtiff 将其转换为 tif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/997620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com