ReportLab和Python Imaging Library图像来自内存问题

时间:2010-02-09 07:41:17

标签: python python-imaging-library reportlab

我遇到了一个我无法用PIL和reportlab搞清楚的问题。具体来说,我想在reportlab中使用PIL Image对象在画布上使用drawImage。

过去,我使用原始数据,StringIO和reportlab的ImageReader类将图像插入到web的reportlab文档中。不幸的是,ImageReader采用文件名或文件缓冲区,如object。

最终目标是能够将QR码(即PIL对象)放入reportlab PDF中。有效的一点是:

    size, qrcode = PyQrcodec.encode('http://www.google.com')
    qrcode.save("img.jpeg")
    self.pdf.drawImage(ImageReader("img.jpeg"), 25, 25, width=125, height=125)
    self.pdf.showPage()

这会保存图像,然后将其读入pdf。显然这样做是没有意义的。

我的努力因reportlab的相对较长的发展历史而变得复杂,这使得找到与最新版本(2.4)相关的答案。

感谢您的帮助。

(顺便说一句,我使用的是1.1.6 PIL)

3 个答案:

答案 0 :(得分:5)

虽然看起来确实应该有效,但事实并非如此。我终于能够找到问题,它位于_isPILImage()函数中。问题是“Image.Image”实际上是“来自PIL导入图像”而我的对象实际上只是来自Image。我会假设它们是相同的,但在任何情况下,实例都不会将它们评估为相同。我的黑客解决方案是将_isPILImage(fileName):...更改为

519 def _isPILImage(im):
520     import Image as PIL_Image
521     try:
522         return isinstance(im,Image.Image) or isinstance(im, PIL_Image.Image)
523     except ImportError:
524         return 0

解决了我的错误。既然你指出了我正确的方向,我最初试图将其作为评论发布,然后接受你的答案,但它不允许有足够的字符。

感谢您的投入!如果你能想出一个更优雅的方法来解决这个问题...(我试图将Image.Image对象包装在PIL Image对象中)让我知道!

答案 1 :(得分:2)

查看ReportLab 2.4的来源,似乎ImageReader将接受PIL Image对象作为“filename”。


def _isPILImage(im):
    try:
        return isinstance(im,Image.Image)
    except ImportError:
        return 0

class ImageReader(object):
    "Wraps up either PIL or Java to get data from bitmaps"
    _cache={}
    def __init__(self, fileName):
        if isinstance(fileName,ImageReader):
            self.__dict__ = fileName.__dict__   #borgize
            return
        #start wih lots of null private fields, to be populated by
        #the relevant engine.
        self.fileName = fileName
        self._image = None
        self._width = None
        self._height = None
        self._transparent = None
        self._data = None
        if _isPILImage(fileName):
            self._image = fileName
            self.fp = getattr(fileName,'fp',None)
            try:
                self.fileName = self._image.fileName
            except AttributeError:
                self.fileName = 'PILIMAGE_%d' % id(self)

答案 2 :(得分:0)

weired 文档声称drawImage和drawInlineImage以相同的方式工作,但是它与开箱即用的drawInlineImage一起使用,并且在drawImage中不起作用