C libtiff错误:未配置旧式JPEG压缩支持

C libtiff错误:未配置旧式JPEG压缩支持,c,macos,tiff,bmp,libtiff,C,Macos,Tiff,Bmp,Libtiff,在Mac OS X上使用libtiff将TIFF转换为BMP时,我遇到以下错误: scannerdata.tif: Old-style JPEG compression support is not configured. scannerdata.tif: Sorry, requested compression method is not configured. 我目前正在Mac OS X中使用libtiff 我的tiff到bmp的实现: static void tifftobmp(cha

在Mac OS X上使用libtiff将TIFF转换为BMP时,我遇到以下错误:

scannerdata.tif: Old-style JPEG compression support is not configured.

scannerdata.tif: Sorry, requested compression method is not configured.
我目前正在Mac OS X中使用libtiff

我的tiff到bmp的实现:

static void tifftobmp(char *colorMode){

    DBG(1, ">> tifftobmp \n");

    /* For files and file header */
    char infile[PATH_MAX] = {0};
    char outfile[PATH_MAX] = {0};
    char tempfile[PATH_MAX] = {0};
    TIFF *tifFile;
    FILE *bmpFile, *tmpBitmapFile;
    uint32 image_width, image_height, long_val, short_val;

    /* For Colour table */
    unsigned char padding;
    unsigned short i;
    unsigned char value;

    /* For image information */
    Image_Information *image_info;
    image_info = (Image_Information *)malloc(sizeof(Image_Information));

    sprintf(infile, TIFF_IMAGE_DATA);
    sprintf(outfile, BMP_IMAGE_DATA);
    sprintf(tempfile, TEMP_IMAGE_DATA);

    /* Open necessary files */
    tifFile = TIFFOpen(infile, "r");
    if (!tifFile){
        DBG(128, "Can't open %s for reading\n", infile);
        TIFFClose(tifFile);
    }

    bmpFile = fopen(outfile, "wb");
    if (!bmpFile){
        DBG(128, "Can't open %s for writing\n", outfile);
        fclose(bmpFile);
    }

    tmpBitmapFile = fopen(tempfile, "wb");
    if (!tmpBitmapFile){
        DBG(128, "Can't open %s for writing\n", tempfile);
        fclose(tmpBitmapFile);
    }

    TIFFGetField(tifFile, TIFFTAG_IMAGELENGTH, &image_height);
    TIFFGetField(tifFile, TIFFTAG_IMAGEWIDTH, &image_width);

    image_info->img_height = image_height;
    image_info->img_width = image_width;

    /* Get Image Info Color */
    if(strcmp(colorMode,"COLOR") == 0){
        get_image_info_color(image_info);

    }else if (strcmp(colorMode,"GRAY") == 0){
        get_image_info_gray(image_info);

    }else if(strcmp(colorMode,"MONO") == 0){
        get_image_info_mono(image_info);

    }

    /* Set Header */
    fwrite("BM", 1, 2, bmpFile);        /* Signature */

    long_val = sizeof(BITMAPFILEHEADER)  + sizeof(BITMAPINFOHEADER) + image_info->img_scansize * image_info->img_height;
    fwrite(&long_val, 4, 1, bmpFile);   /* Size in bytes of the bitmap file */

    short_val = 0;
    fwrite(&short_val, 2, 1, bmpFile);  /* Reserved, set as 0 */
    fwrite(&short_val, 2, 1, bmpFile);  /* Reserved, set as 0 */

    if(strcmp(colorMode,"COLOR") == 0){ /* Offset of the image from file start */
        long_val = 54;

    }else{
        long_val = 54 + (4 * (1 << image_info->img_bits_per_pixel));
    }
    fwrite(&long_val, 4, 1, bmpFile);

    long_val = sizeof(BITMAPINFOHEADER);  /* Size of BMPInfoHeader structure */
    fwrite(&long_val, 4, 1, bmpFile);
    fwrite(&image_info->img_width, 4, 1, bmpFile);
    fwrite(&image_info->img_height, 4, 1, bmpFile);

    short_val = 1;                  /* Number of image planes */
    fwrite(&short_val, 2, 1, bmpFile);

    if(strcmp(colorMode,"MONO") == 0){ /* Number of bits per pixel */
        short_val = image_info->img_bits_per_pixel;

    }else if (strcmp(colorMode,"COLOR") == 0){
        short_val = image_info->img_bits_per_pixel;

    }else if (strcmp(colorMode,"GRAY") == 0){
        short_val = image_info->img_bits_per_pixel;

    }
    fwrite(&short_val, 2, 1, bmpFile);
    long_val = 0;                   /* Compression method */
    fwrite(&long_val, 4, 1, bmpFile);
    long_val = 0;                   /* Size of uncompressed image in bytes */
    fwrite(&long_val, 4, 1, bmpFile);
    long_val = 0;                   /* X resolution, pixels per meter */
    fwrite(&long_val, 4, 1, bmpFile);
    long_val = 0;                   /* Y resolution, pixels per meter */
    fwrite(&long_val, 4, 1, bmpFile);

    if(strcmp(colorMode,"COLOR") == 0){  /* Size of colour table */
        long_val = 0;

    }else{
        long_val = 1 << image_info->img_bits_per_pixel;

    }
    fwrite(&long_val, 4, 1, bmpFile);

    long_val = 0;                   /* Number of important colours */
    fwrite(&long_val, 4, 1, bmpFile);

    /* Colour table */
    if(strcmp(colorMode,"MONO") == 0){
        value = 0xFF;
        padding = 0;

        /* white */
        fwrite(&value, 1, 1, bmpFile); /* R component */
        fwrite(&value, 1, 1, bmpFile); /* G component */
        fwrite(&value, 1, 1, bmpFile); /* B component */
        fwrite(&padding, 1, 1, bmpFile); /* padding */

        /* black */
        value = 0x00;
        fwrite(&value, 1, 1, bmpFile); /* R component */
        fwrite(&value, 1, 1, bmpFile); /* G component */
        fwrite(&value, 1, 1, bmpFile); /* B component */
        fwrite(&padding, 1, 1, bmpFile); /* padding */

    }else if (strcmp(colorMode,"GRAY") == 0){
        padding = 0;

        for ( i = 0; i <= 255; i++ ){
            fwrite(&i, 1, 1, bmpFile); /* R component */
            fwrite(&i, 1, 1, bmpFile); /* G component */
            fwrite(&i, 1, 1, bmpFile); /* B component */
            fwrite(&padding, 1, 1, bmpFile); /* padding */
        }

    }

    /* Read and write image */
    if(strcmp(colorMode,"MONO") == 0){
        read_mono_image(tifFile, tmpBitmapFile, image_info);

    }else if(strcmp(colorMode,"GRAY") == 0){
        read_gray_image(tifFile, tmpBitmapFile, image_info);

    }else if(strcmp(colorMode,"COLOR") == 0){
        read_color_image(tifFile, bmpFile, image_info);
    }

    if(strcmp(colorMode,"COLOR") != 0){
        fclose(tmpBitmapFile);
        flip_image(image_info, bmpFile);
    }

    fclose(bmpFile);
    TIFFClose(tifFile);

    DBG(1, "<< tifftobmp \n");

}
static void tifftobmp(char*colorMode){
DBG(1,“>>tifftobmp\n”);
/*用于文件和文件头*/
字符填充[PATH_MAX]={0};
字符输出文件[PATH_MAX]={0};
char tempfile[PATH_MAX]={0};
TIFF*tifFile;
文件*bmpFile,*tmpBitmapFile;
uint32图像宽度、图像高度、长值、短值;
/*颜色表*/
无符号字符填充;
无符号短i;
无符号字符值;
/*图像信息*/
图像信息*图像信息;
图像信息=(图像信息*)malloc(图像信息);
sprintf(内嵌、TIFF图像数据);
sprintf(输出文件、BMP_图像_数据);
sprintf(临时文件、临时图像数据);
/*打开必要的文件*/
tifFile=TIFFOpen(填充,r“);
如果(!tifFile){
DBG(128,“无法打开%s进行读取\n”,填充);
TIFFClose(tifFile);
}
bmpFile=fopen(outfile,“wb”);
如果(!bmpFile){
DBG(128,“无法打开%s进行写入”,输出文件);
fclose(bmpFile);
}
tmpBitmapFile=fopen(tempfile,“wb”);
如果(!tmpBitmapFile){
DBG(128,“无法打开%s进行写入”,tempfile);
fclose(tmpBitmapFile);
}
TIFFGetField(tifFile、TIFFTAG_图像长度和图像高度);
TIFFGetField(tifFile、TIFFTAG_图像宽度和图像宽度);
图像信息->图像高度=图像高度;
图像信息->图像宽度=图像宽度;
/*获取图像颜色信息*/
如果(strcmp(颜色模式,“颜色”)==0){
获取图像信息颜色(图像信息);
}否则如果(strcmp(彩色模式,“灰色”)==0){
获取图像信息灰度(图像信息);
}否则如果(strcmp(彩色模式,“单声道”)==0){
获取图像信息单声道(图像信息);
}
/*设置标题*/
写(“BM”,1,2,BMP文件);/*签名*/
long\u val=sizeof(BITMAPFILEHEADER)+sizeof(bitmapinfo header)+image\u info->img\u scansize*image\u info->img\u height;
fwrite(&long_val,4,1,bmpFile);/*位图文件的字节大小*/
短值=0;
fwrite(&short_val,2,1,bmpFile);/*保留,设置为0*/
fwrite(&short_val,2,1,bmpFile);/*保留,设置为0*/
如果(strcmp(colorMode,“COLOR”)==0){/*图像从文件开始的偏移量*/
long_val=54;
}否则{
long_val=54+(4*(每像素1个img_比特));
}
写入(&long_val,4,1,bmpFile);
long_val=sizeof(BitMapInfo头);/*BMPInfoHeader结构的大小*/
写入(&long_val,4,1,bmpFile);
写入(图像信息->图像宽度,4,1,bmp文件);
写入(图像信息->图像高度,4,1,bmp文件);
short_val=1;/*图像平面数*/
fwrite(&short_val,2,1,bmpFile);
if(strcmp(colorMode,“MONO”)==0{/*每个像素的位数*/
short\u val=图像信息->每像素图像位;
}否则如果(strcmp(颜色模式,“颜色”)==0){
short\u val=图像信息->每像素图像位;
}否则如果(strcmp(彩色模式,“灰色”)==0){
short\u val=图像信息->每像素图像位;
}
fwrite(&short_val,2,1,bmpFile);
long_val=0;/*压缩方法*/
写入(&long_val,4,1,bmpFile);
long_val=0;/*未压缩图像的大小(字节)*/
写入(&long_val,4,1,bmpFile);
long_val=0;/*X分辨率,每米像素数*/
写入(&long_val,4,1,bmpFile);
long_val=0;/*Y分辨率,每米像素数*/
写入(&long_val,4,1,bmpFile);
if(strcmp(colorMode,“COLOR”)==0{/*颜色表的大小*/
long_val=0;
}否则{
long_val=每像素1个img_位;
}
写入(&long_val,4,1,bmpFile);
long_val=0;/*重要颜色的数量*/
写入(&long_val,4,1,bmpFile);
/*颜色表*/
如果(strcmp(彩色模式,“单声道”)==0){
值=0xFF;
填充=0;
/*白色的*/
fwrite(&value,1,1,bmpFile);/*R分量*/
fwrite(&value,1,1,bmpFile);/*G分量*/
fwrite(&value,1,1,bmpFile);/*B组件*/
fwrite(&padding,1,1,bmp文件);/*padding*/
/*黑色的*/
值=0x00;
fwrite(&value,1,1,bmpFile);/*R分量*/
fwrite(&value,1,1,bmpFile);/*G分量*/
fwrite(&value,1,1,bmpFile);/*B组件*/
fwrite(&padding,1,1,bmp文件);/*padding*/
}否则如果(strcmp(彩色模式,“灰色”)==0){
填充=0;

对于(i=0;i请查看“nmake.opt”中Libtiff的源代码


因此,默认情况下,JPEG支持未启用。

我想您的代码是可以的,但不相关,因为您尝试转换的文件似乎不受苹果版本的libtiff支持。一个选项是安装Macports,并使用它安装
tiff
,然后根据
/opt/local/lib/libtiff.a
静态编译(可能使用其他链接器标志Xcode设置)。如果这不起作用,那么您必须自己编译
libtiff
。@特洛伊木马我目前有usr/local/lib/libtiff.5。dylib@trojanfoe这是安装libtiff的正确命令吗?sudo port install lcms-install lcms。这还将安装jpeg、zlib、tiff抱歉,我不知道;为什么要lcms?@特洛伊木马安装tiff
#
# Uncomment and edit following lines to enable JPEG support.
#
#JPEG_SUPPORT   = 1
!IFDEF JPEG_SUPPORT
LIBS        = $(LIBS) $(JPEG_LIB)
EXTRAFLAGS  = -DJPEG_SUPPORT -DOJPEG_SUPPORT $(EXTRAFLAGS)
!ENDIF