首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >32 bpp单色位图到1 bpp TIFF

32 bpp单色位图到1 bpp TIFF
EN

Stack Overflow用户
提问于 2014-04-08 08:58:30
回答 1查看 685关注 0票数 0

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

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

我设法产生了一个32 BPP TIFF,但不可能减少到1bpp,输出图像总是不可读的。是否有人成功地完成了类似的任务?

更特别的是:

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

非常感谢!

UPDATE:在莫希特·贾恩的宝贵帮助下生成的代码

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-08 09:01:12

若要将32 bpp转换为1 bpp,则提取RGB并将其转换为Y(亮度),并使用一定的阈值转换为1 bpp。

每个像素的样本数和位数应该是1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22932243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档