Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 32 bpp单色位图到1 bpp TIFF_Android_C_Image_Java Native Interface - Fatal编程技术网

Android 32 bpp单色位图到1 bpp TIFF

Android 32 bpp单色位图到1 bpp TIFF,android,c,image,java-native-interface,Android,C,Image,Java Native Interface,我的android应用程序使用一个外部库来进行一些图像处理。治疗链的最终输出是单色位图,但保存的是彩色位图(32bpp) 该图像必须上传到云blob,因此出于带宽考虑,我想将其转换为1bpp G4压缩TIFF。我通过JNI成功地将libTIFF集成到我的应用程序中,现在我正在用C编写转换例程。我有点困在这里 我设法制作了一个32 BPP的TIFF,但不可能减少到1bpp,输出图像总是无法读取。有人成功地完成了类似的任务吗 更具体地说: 每像素采样数和每采样位数的值应该是多少 参数 如何确定带钢

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

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

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

更具体地说:

  • 每像素采样数和每采样位数的值应该是多少 参数
  • 如何确定带钢尺寸
  • 如何填充每一条?(即:如何将32bpp像素线转换为1bpp像素条?)
非常感谢

更新:在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;
}
int-convertex32bpbitmap到bpptiff(char*位图、int-height、int-width、int-resx、int-resy、char-const*tifffilename)
{
蒂芙*蒂芙;
if((tiff=TIFFOpen(tifffilename,“w”))==NULL)
{
返回TC\u错误\u打开\u失败;
}
//TIFF设置
tiff设置字段(tiff、tiff标签分辨率单位、分辨率单位英寸);
tiff设置字段(tiff、tiff标签分辨率、resx);
TIFFSetField(tiff,TIFFTAG_YRESOLUTION,resy);
TIFFSetField(tiff,TIFFTAG_COMPRESSION,COMPRESSION_CCITTFAX4);//Group4 COMPRESSION
tiff设置字段(tiff,tiff标记图像宽度,宽度);
tiff设置字段(tiff、tiff标记_图像长度、高度);
TIFFSetField(tiff,TIFFTAG_ROWSPERSTRIP,1);
TIFFSetField(tiff,TIFFTAG_SAMPLESPERPIXEL,1);
TIFFSetField(tiff,TIFFTAG_BITSPERSAMPLE,1);
tiff设置字段(tiff,tiff标记方向,方向左上角);
TIFFSetField(tiff、TIFFTAG_PLANARCONFIG、PLANARCONFIG_CONTIG);
TIFFSetField(tiff、TIFFTAG光度学、光度学微白);
tsize_t tbufsize=(宽度+7)/8;//1bpp像素行的Tiff扫描线缓冲区大小
//现在将图像逐行写入文件
int x,y;
对于(y=0;y<高度;y++)
{
char*buffer=malloc(tbufsize);
memset(缓冲区,0,tbufsize);
对于(x=0;x>(x%8));
}
}
如果(TIFFWriteScanline(tiff,缓冲区,y,0)!=1)
{
返回TC\u错误\u写入失败;
}
if(缓冲区)
{
自由(缓冲);
缓冲区=空;
}
}
TIFFClose(tiff);
tiff=NULL;
返回TC_成功;
}

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


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

谢谢。thresold应该很简单,因为输入图像已经是单色的。条带尺寸如何?由于您随身携带完整的图像数据,我建议将其保存为扫描线,即RowsPerStrip=1。如果图像已经是单色的,您也可以读取,那么您甚至不需要将其转换为Y,提取任意一个R、G或B分量,因为它们都等于Y。当您说“将其保存为扫描线”时,您的意思是我应该使用TIFFWriteScanline方法吗?这是我已经做过的,但是缓冲区大小应该是多少,特别是当图像宽度不是8倍时?是的,您可以使用TIFFWriteScanline。每行的长度应为(宽度+7)/8字节。额外的位应保留为零并写入。