0

我有以下将 pdf 转换为 tiff 文件的代码,我有两个问题

  1. 例如,当我的 pdf 文件由两页组成时,我只有第二页转换为 tiff。

  2. 与使用 convert 命令转换的相同 pdf 文件相比,tiff 文件质量非常差

    转换 -density 300 file.pdf -depth 8 -alpha remove -background white +repage file.tiff

/*
 gcc -I/usr/local/include/ImageMagick-7 -DMAGICKCORE_HDRI_ENABLE=1
 -DMAGICKCORE_QUANTUM_DEPTH=16 magick.c -lMagickWand-7.Q16HDRI
 -o magick
 */
#include <MagickWand/MagickWand.h>
int main(int argc, char *argv[])
{
    MagickWand *mw = NULL;

    MagickWandGenesis();
    mw = NewMagickWand();
    MagickSetImageResolution(mw, 300, 300);

    MagickReadImage(mw, argv[1]);

    PixelWand *color = NewPixelWand();
    PixelSetColor(color, "white");
    MagickSetImageBackgroundColor(mw, color);
    MagickWand *newwand = MagickMergeImageLayers(mw, FlattenLayer);

    MagickSetImageCompressionQuality(newwand, 95);

    MagickSetFirstIterator(newwand);
    MagickSetFormat(newwand, "tiff");
    MagickWriteImage(newwand, "/tmp/out.tiff");

    mw = DestroyMagickWand(mw);
    newwand = DestroyMagickWand(newwand);
    MagickWandTerminus();

    return 0;
}

解决方案: 集成@emcconville feeds 后,将多页 PDF 转换为 tiff 的功能如下:

#include <MagickWand/MagickWand.h>


static void __attribute__((constructor)) mg_ctor(void)
{
    MagickWandGenesis();
}

static void __attribute__((destructor)) mg_dtor(void)
{
    MagickWandTerminus();
}

/*
 * pdf2tiff {pdf file} {output tiff file}
 *
 */
int main(int argc, char *argv[])
{
    MagickWand *mw = NewMagickWand();
    int i = 0;

    MagickSetResolution(mw, 300, 300);
    MagickReadImage(mw, argv[1]);

    PixelWand *color = NewPixelWand();
    PixelSetColor(color, "white");

    for (i = 0; i < MagickGetNumberImages(mw); i++) {
        MagickSetIteratorIndex(mw, i);
        MagickSetImageAlphaChannel(mw, RemoveAlphaChannel);
        MagickSetImageBackgroundColor(mw, color);
    }

    MagickResetIterator(mw);

    MagickSetFormat(mw, "tiff");
    MagickWriteImages(mw, argv[2], 1);

    DestroyMagickWand(mw);
    DestroyPixelWand(color);

    return 0;
}
4

1 回答 1

3

例如,当我的 pdf 文件由两页组成时,我只有第二页转换为 tiff。

您想在阅读 PDF 后立即重置图像迭代器。

MagickReadImage(mw, argv[1]);
MagickResetIterator(mw);

与使用 convert 命令转换的相同 pdf 文件相比,tiff 文件质量非常差 [...]

我怀疑MagickSetImageResolution应该是MagickSetResolution

// MagickSetImageResolution(mw, 300, 300);
MagickSetResolution(mw, 300, 300);
于 2020-05-22T15:56:44.377 回答