使用Imagemagick转换包含光栅的PDF,会在光栅覆盖的部分后面生成白色背景

使用Imagemagick转换包含光栅的PDF,会在光栅覆盖的部分后面生成白色背景,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,我尝试使用ImageMagick(v6.8.9-9 Q16)将包含PNG文件的PDF转换为PNG文件 背景是透明的。在阳光下,它看起来也很好。但在中,PDF中最初由PNG占据的区域具有白色背景。请查看链接以了解更多信息 我运行的命令如下所示: convert-colorspace sRGB dice.pdf converted_dice.png pdfimages -png my.pdf my 我还尝试设置了-透明白色开关,但它最终去掉了最终图像中实际需要的白色 是否有任何额外的开关或参数要传

我尝试使用ImageMagick(v6.8.9-9 Q16)将包含PNG文件的PDF转换为PNG文件

背景是透明的。在阳光下,它看起来也很好。但在中,PDF中最初由PNG占据的区域具有白色背景。请查看链接以了解更多信息

我运行的命令如下所示:

convert-colorspace sRGB dice.pdf converted_dice.png

pdfimages -png my.pdf my
我还尝试设置了
-透明白色
开关,但它最终去掉了最终图像中实际需要的白色


是否有任何额外的开关或参数要传递到
convert
,以摆脱这种白色背景?

您执行此任务的方法无法工作

您使用的命令将完整的字母大小的PDF页面(612 x 792 pt)转换为PNG图像

但是,嵌入在PDF页面中的图像的原始大小(612 x 792 pt)为800 x 600像素。这可以通过运行
pdfimages-list
看到:

pdfimages -list dice.pdf 
 page num  type width height color comp bpc  enc interp object ID x-ppi y-ppi  size ratio
 ----------------------------------------------------------------------------------------
    1   0 image   800   600   rgb     3   8  image   no     12  0    72    72  277K   20%
    1   1 smask   800   600  gray     1   8  image   no     12  0    72    72 50.1K   11%
因此,这是转换PDF页面时的第一个问题:它无法为您提供所包含图像的正确大小

然而,第二个更基本的问题是:从转换PDF页面中获得的任何图像都是所有PDF对象的组合,这些对象彼此重叠,就像它们来自页面区域一样。(当然,您只能裁剪页面的一部分,但这同样会提供裁剪区域中所有PDF对象的组合…)。当您尝试将所有白色像素转换为透明像素时遇到的结果是:由于最初不同的对象合并为一个像素表示形式,因此您无法再根据需要区分它们

您应该采用不同的方法并使用不同的工具提取图像:使用
pdfimages
(上面使用的工具与
-list
参数一起显示PDF页面中的图像属性)。如您所见,有两个图像列表:一个是RGB光栅图像,另一个是灰度光栅图像,称为type
smask
(软掩码)

以下是将两幅图像提取为PNG的命令:

 pdfimages -png dice.pdf dice-images
这将提取两个:

  • dice-images-0000.png
    (彩色图像)
  • dice-images-0001.png
    (灰度图像)
  • 注意:只有最新版本的
    pdfimages
    ,即Poppler版本,才允许您将图像提取为PNG。在PDF中没有PNG。只有光栅数据,使用不同的方法进行压缩。旧版本只能将图像提取为PPM或PNM。这对您没有任何影响我在下面描述的内容。即使您提取PPM/PNM图像,这两个文件仍可以按如下所述进行处理…)

    下面是这两幅作品并排缩小的蒙太奇:

    如您所见,图像本身没有透明背景,而是白色背景(没有Alpha通道)。在PDF格式中,这两个图像组合使用以创建透明区域:

  • 在软遮罩(右)中显示为完全黑色意味着:真实图像(左)的这个像素意味着完全透明
  • 在软遮罩(右)中显示为完全白色的表示:真实图像(左)的这个像素表示完全不透明
  • 在软遮罩(右)中以灰色阴影显示的内容意味着:真实图像(左)的该像素意味着部分透明(与其灰度/黑色级别一致)

  • 要将这两个文件(彩色图像和灰度软蒙版)组合成一个透明的PNG,您现在可以使用ImageMagick…

    Kurt已经非常详细地解释了整个过程。下面是如何在通过
    pdfimages-PNG

    pdfimages -png my.pdf my
    
    这将在两个文件中重新查找

    identify my-0*png
      my-000.png PNG 360x310 360x310+0+0 8-bit sRGB 256c 3.3KB 0.000u 0:00.000
      my-001.png PNG 360x310 360x310+0+0 8-bit sRGB 256c 9.44KB 0.000u 0:00.000
    
    my-001.png
    是在
    pdfimages-list
    中标记为
    smask
    的图像。要将图像重新组装回其原始形式,请使用
    -compose copycopacity
    和ImageMagick命令
    composite

    composite -compose CopyOpacity my-001.png my-000.png my-reassembled.png
    
    有关更多信息,另请参见。

    没有“包含PNG文件的PDF”。一旦图像位于PDF中,它就是光栅数据(对于这些光栅数据块有各种压缩方案,其中一种与JPEG使用的压缩方案相同)。它可能是以前的PNG文件,但现在已经不存在了。无法仅从PDF数据中发现它。当然,您可以提取光栅数据并将其再次转换为PNG。或者转换为TIFF、GIF、JPEG……如果您对PDF的创建没有先见之明,您将不知道包含的图像以前的life form…“要将这两个文件(彩色图像和灰度软遮罩)组合回一个具有透明度的PNG,您现在可以使用ImageMagick…”--ImageMagick命令是如何执行此操作的?即转换-???