ReportLab显示方向错误的图像

时间:2015-12-23 15:57:07

标签: python python-imaging-library reportlab

我正在使用reportlab从python API生成PDF文档。 这些文件包括载有以下内容的照片(以前用相机或移动设备拍摄):

from reportlab.platypus import Image
img = Image(path)
story.append(img)

问题:某些图像没有以正确的方向显示(某些EXIF数据可能在某些时候丢失或被忽略)。

我遇到过类似PIL的问题一次,我选择的解决方案是使用Wand而不是PIL或Pillow,但看起来ReportLab只使用PIL来处理Python的图像...

我找到this code snippet from another question但我不确定如何编辑reportlab以包含它,或者它是否是一个好方法。

我很惊讶我没有找到关于这个主题的任何内容,我不能成为唯一一个想要在reportlab生成的PDF中包含图片的人......

这是在左侧预览中打开原始图像的图片,右侧是PDF: 1

感谢您的帮助,我一直在努力工作几个小时......

1 个答案:

答案 0 :(得分:0)

我实际上遇到了与pyCairo相同的问题。

我有一堆JPEG图像,其中一些直接放在PDF文档中,另一些则在插入PDF之前用pyCairo进行操作。

将JPEG图像插入到reportlab PDF文档中,或者将图像从JPEG转换为PNG以使用pyCairo时(据我所知pyCairo不能与JPEG一起使用),存储在图像中的图像的方向EXIF迷路了。

这是我最终做的事情:

from reportlab.platypus import Image
from wand.image import Image as WandImage

def AddAPictureToDocument():

     with WandImage(filename=path) as wimg:
          WandConvertToPNG(wimg,pngDestinationPath)

     img = Image(pngDestinationPath)
     story.append(img)

def WandConvertToPNG(img, savepath):

    exif = {}
    exif.update((k[5:], v) for k, v in img.metadata.items()
                if k.startswith('exif:'))

    orientation = exif['Orientation']

    with img.convert('png') as converted:
        if   int(orientation) == 3 :
            converted.rotate(180)
        elif int(orientation) == 6 :
            converted.rotate(90)
        elif int(orientation) == 8 :
            converted.rotate(270)

    converted.save(filename=savepath)

但它可能非常慢,特别是对于pyCairo,因为我需要:

1)从JPEG转换为PNG,

2)将图像旋转到正确的方向

3)使用pyCairo在图像上绘制东西

4)将pyCairo处理的图像保存到PNG

5)将PNG转换为JPEG以压缩图像

我认为PIL或Wand等图像库在JPEG-> PNG转换后会处理图像的方向是不是很天真?

无论如何,我仍然在寻找更好的解决方案。