gpt4 book ai didi

android - 32 bpp 单色位图转 1 bpp TIFF

转载 作者:行者123 更新时间:2023-11-30 17:35:45 25 4
gpt4 key购买 nike

我的 Android 应用程序使用外部库来进行一些图像处理。处理链的最终输出是单色位图,但保存的是彩色位图(32bpp)。

图像必须上传到云 blob,因此出于带宽问题,我想将其转换为 1bpp G4 压缩 TIFF。我通过 JNI 成功地将 libTIFF 集成到我的应用程序中,现在我正在用 C 编写转换例程。我有点卡在这里。

我设法生成了 32 BPP TIFF,但无法减少到 1bpp,输出图像始终无法读取。有人成功完成类似的任务吗?

更具体地说:

  • SAMPLE_PER_PIXEL 和 BITS_PER_SAMPLE 的值应该是多少参数 ?
  • 如何确定 strip 尺寸?
  • 如何填写每个 strip ? (即:如何将 32bpp 像素线转换为 1 bpp 像素条?)

非常感谢!

更新:在 Mohit Jain 的宝贵帮助下生成的代码

int ConvertMonochrome32BppBitmapTo1BppTiff(char* bitmap, int height, int width, int resx, int resy, char const *tifffilename)
{
TIFF *tiff;

if ((tiff = TIFFOpen(tifffilename, "w")) == NULL)
{
return TC_ERROR_OPEN_FAILED;
}

// TIFF Settings
TIFFSetField(tiff, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
TIFFSetField(tiff, TIFFTAG_XRESOLUTION, resx);
TIFFSetField(tiff, TIFFTAG_YRESOLUTION, resy);
TIFFSetField(tiff, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4); //Group4 compression
TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, height);
TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, 1);
TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 1);
TIFFSetField(tiff, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);

tsize_t tbufsize = (width + 7) / 8; //Tiff ScanLine buffer size for 1bpp pixel row

//Now writing image to the file one row by one
int x, y;
for (y = 0; y < height; y++)
{
char *buffer = malloc(tbufsize);
memset(buffer, 0, tbufsize);

for (x = 0; x < width; x++)
{
//offset of the 1st byte of each pixel in the input image (is enough to determine is black or white in 32 bpp monochrome bitmap)
uint32 bmpoffset = ((y * width) + x) * 4;

if (bitmap[bmpoffset] == 0) //Black pixel ?
{
uint32 tiffoffset = x / 8;
*(buffer + tiffoffset) |= (0b10000000 >> (x % 8));
}
}

if (TIFFWriteScanline(tiff, buffer, y, 0) != 1)
{
return TC_ERROR_WRITING_FAILED;
}

if (buffer)
{
free(buffer);
buffer = NULL;
}
}

TIFFClose(tiff);
tiff = NULL;

return TC_SUCCESSFULL;
}

最佳答案

要将 32 bpp 转换为 1 bpp,请提取 RGB 并将其转换为 Y(亮度),然后使用一些阈值转换为 1 bpp。

每像素的样本数和位数应为 1。

关于android - 32 bpp 单色位图转 1 bpp TIFF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22932243/

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