ReportLab и изображения Библиотеки Обработки изображений Python из памяти выходят

Я столкнулся с проблемой, которую я, может казаться, не выясняю с PIL и reportlab. А именно, я хотел бы использовать drawImage на холсте в reportlab использование Объекта изображения PIL.

В прошлом я вставил изображения в reportlab документы от сети с помощью необработанных данных, StringIO и класса ImageReader reportlab. К сожалению, ImageReader берет имя файла или буфер файлов как объект.

Конечная цель должна быть в состоянии поместить QR-коды, (которые являются объектами PIL) в reportlab PDFs. Одна вещь, которая действительно работает, следующая:

    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),

10
задан philipk 9 February 2010 в 07:41
поделиться

2 ответа

Хотя кажется, что это должно работать, на самом деле это не так. Я наконец-то смог отследить проблему, и она оказалась в функции _isPILImage(). Проблема в том, что "Image.Image" на самом деле "from PIL import Image", тогда как мой объект на самом деле просто из Image. Я бы предположил, что они одинаковые, но в любом случае isinstance не оценивает их как одинаковые. Моим хакерским решением было изменить _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), дайте мне знать!

5
ответ дан 4 December 2019 в 02:50
поделиться

В дополнение ко всем комментариям, я предлагаю вам прочитать Технический отчет по производительности C++ , в котором конкретно рассматриваются интересующие вас темы: использование C++ во встроенных (включая жесткие системы реального времени); как обычно осуществляется обработка исключений и какие накладные расходы она имеет; накладные расходы на выделение свободного хранилища.

Отчет действительно хорош, так как развенчивает многие популярные хвосты о производительности C++.

-121--2044140-

Я не использую многие продукты или даже типы продуктов, которые вы используете, но я дам вам свой опыт.

Я запускаю среду TEST параллельно с моей средой START. У меня нет местного тестирования как такового. Если это слишком трудно сделать в реальной среде TEST, тогда я исправлю процесс сборки. Я не вижу точки в локальном тестировании, так как среды отличаются. ОБНОВЛЕНИЕ: Единственное, что я делаю локально - это запускаю «php -l», прежде чем выкладываю что-либо. Останавливает глупые ошибки.

Процесс построения работает с любыми компонентами текущей рабочей области, включая незафиксированный код. Это не каждая чашка чая, но я собираюсь на ТЕСТ очень часто. Все фиксируется, прежде чем перейти в START.

Часть процесса сборки (аналогично вашей) создает два МЕТА-файла. Один содержит последние (обычно) 100 изменений, а также дает мне текущий номер списка изменений. Показывает, какие изменения установлены. Другой содержит CLIENTSPEC (в терминах Perforce), который показывает мне, какие именно ветви использовались в этой сборке. Вместе они дают мне воспроизводимые построения.

Я строю не непосредственно в целевую среду, а в промежуточную область на сервере. Я использую SSH, так что это имеет смысл. Это дает мне несколько преимуществ. Самое главное, это позволяет избежать смерти половины пути через большую загрузку. Это также дает мне место для хранения МЕТА-файлов, и все файлы сборки автоматически архивируются (так что я могу сразу вернуться к любой сборке). Сценарий также регистрирует обновление (так что есть запись в потоке журнала и я могу видеть до и после -) и запускает все демоны (я использую демонтоолы так «svc -t»). Все это лучше на целевой машине.

Еще одна проблема - изменения базы данных. Я храню главный сценарий схемы БД, который я обновляю при каждом изменении схемы. Каждое из изменений также переходит в сценарий changes.sql, который загружается вместе со сборкой в промежуточную область. Сценарий запускается как часть сценария установки.

-121--613498-

Глядя на источник для EventLab 2.4, кажется, ImageReader примет объект PIL Image как «имя файла».


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
ответ дан 4 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: