예제 #1
0
 def __init__(self, dp, **kw):
     DefaultRenderer.__init__(self, dp, **kw)
     Purr.progressMessage("rendering %s" % dp.filename, sub=True)
     img = PIL.Image.open(dp.fullpath)
     # If image format is not compatible with browsers, save it in PNG format.
     # self.fullimage will refer to the browser-compatible image, to which the thumbnail will link
     if img.format not in ["GIF", "JPEG", "PNG"]:
         self.fullimage, path, uptodate = self.subproduct("-full.png")
         if not uptodate:
             try:
                 img.save(path, "PNG")
             except:
                 print("Error saving %s in PNG format" % path)
                 traceback.print_exc()
                 self.fullimage = dp.filename
     else:
         self.fullimage = dp.filename
     # now, do we need to generate a thumbnail?
     tsize = self.getOption("image-thumbnail-width"), self.getOption("image-thumbnail-height")
     width, height = img.size
     factors = width / float(tsize[0]), height / float(tsize[1])
     if max(factors) <= 1:
         self.thumbnail = self.fullimage
     else:
         # regenerate thumbnail if needed
         self.thumbnail, path, uptodate = self.subproduct("-thumb.png")
         try:
             # regenerate only if doesn't exist
             if not uptodate:
                 # use max resize factor
                 factor = max(factors)
                 img = img.resize((int(width / factor), int(height / factor)), PIL.Image.ANTIALIAS)
                 img.save(path, "PNG")
         except:
             print("Error saving thumbnail %s in PNG format" % path)
             traceback.print_exc()
             self.thumbnail = None
예제 #2
0
 def __init__(self, dp, refresh=0):
     DefaultRenderer.__init__(self, dp, refresh=refresh)
     self.rendercache = {}
     self._regenerated = False
예제 #3
0
class ImageRenderer(DefaultRenderer):
    """This class renders PIL-compatible image data products."""
    _extensions = set([
        "jpg", "jpeg", "png", "gif", "xpm", "ppm", "pbm", "pnm", "tiff", "tif"
    ])

    @staticmethod
    def canRender(filename):
        """Check extensions."""
        name, ext = os.path.splitext(filename)
        ext = ext.lstrip('.').lower()
        if ext in ImageRenderer._extensions:
            return 100
        else:
            return False

    # this gives a short ID for the class (used in GUIs and such)
    renderer_id = "image"

    # this gives a documentation string. You can use rich text here
    renderer_doc = """<P>The "image" plugin provides rendering of image-type data products.
      It can render any image that is compatible with the Python Image Library."""

    # define renderer options
    DefaultRenderer.addOption("image-thumbnail-width", 512, dtype=int, doc="Maximum width of thumbnails")
    DefaultRenderer.addOption("image-thumbnail-height", 256, dtype=int, doc="Maximum height of thumbnails")

    def __init__(self, dp, **kw):
        DefaultRenderer.__init__(self, dp, **kw)
        Purr.progressMessage("rendering %s" % dp.filename, sub=True)
        img = PIL.Image.open(dp.fullpath)
        # If image format is not compatible with browsers, save it in PNG format.
        # self.fullimage will refer to the browser-compatible image, to which the thumbnail will link
        if img.format not in ["GIF", "JPEG", "PNG"]:
            self.fullimage, path, uptodate = self.subproduct("-full.png")
            if not uptodate:
                try:
                    img.save(path, "PNG")
                except:
                    print("Error saving %s in PNG format" % path)
                    traceback.print_exc()
                    self.fullimage = dp.filename
        else:
            self.fullimage = dp.filename
        # now, do we need to generate a thumbnail?
        tsize = self.getOption("image-thumbnail-width"), self.getOption("image-thumbnail-height")
        width, height = img.size
        factors = width / float(tsize[0]), height / float(tsize[1])
        if max(factors) <= 1:
            self.thumbnail = self.fullimage
        else:
            # regenerate thumbnail if needed
            self.thumbnail, path, uptodate = self.subproduct("-thumb.png")
            try:
                # regenerate only if doesn't exist
                if not uptodate:
                    # use max resize factor
                    factor = max(factors)
                    img = img.resize((int(width / factor), int(height / factor)), PIL.Image.ANTIALIAS)
                    img.save(path, "PNG")
            except:
                print("Error saving thumbnail %s in PNG format" % path)
                traceback.print_exc()
                self.thumbnail = None

    def renderThumbnail(self, relpath=""):
        """renderThumbnail() is called to render a thumbnail of the DP (e.g. in Data Product tables)."""
        # no thumbnail -- return empty string
        if self.thumbnail is None:
            return ""
        # else thumbnail is same as full image (because image was small enough), insert directly
        elif self.thumbnail is self.fullimage:
            fname = relpath + self.fullimage
            return """<IMG SRC="%s" ALT="%s"></IMG>""" % (quote_url(fname), quote_url(os.path.basename(self.filename)))
        # else return thumbnail linking to full image
        else:
            tname = relpath + self.thumbnail
            fname = relpath + self.fullimage
            return """<A HREF="%s"><IMG SRC="%s" ALT="%s"></A>""" % (
            quote_url(fname), quote_url(tname), quote_url(os.path.basename(self.filename)))
예제 #4
0
 def __init__(self, dp, refresh=0):
     DefaultRenderer.__init__(self, dp, refresh=refresh)
     self.rendercache = {}
     self._regenerated = False