Skip to content

Instantly share code, notes, and snippets.

@deeplook
Created March 14, 2013 15:41
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save deeplook/5162445 to your computer and use it in GitHub Desktop.
Save deeplook/5162445 to your computer and use it in GitHub Desktop.
An IPython notebook playing with display hook functions to display PIL images and Reportlab drawings.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "image_displayhook.ipynb"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"IPython display hookery"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A few niceties to help display visual output as instantly as Matplotlib plots in an IPython notebook. (To run this notebook completely, you'll need the packages `reportlab` and `PIL` to be installed.) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plots generated with Matplotlib are shown immediately in the next cell: "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = linspace(0, 3*pi, 500)\n",
"plot(x, sin(x**2))\n",
"title('A simple chirp');"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "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\nMILw/wFa1cBzw0Gh4AAAAABJRU5ErkJggg==\n"
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The same is almost true for bitmaps generated with PIL, but we have to use the convenience function *imshow()*:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from PIL import Image\n",
"from PIL.ImageDraw import Draw\n",
"img = Image.new(\"RGBA\", (100, 100))\n",
"draw = Draw(img)\n",
"draw.rectangle(((0,0), (100, 100)), fill=(255, 100, 0))\n",
"# img.save(\"foo.png\")\n",
"imshow(numpy.asarray(img)) "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 2,
"text": [
"<matplotlib.image.AxesImage at 0x1050da110>"
]
},
{
"output_type": "display_data",
"png": "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\nmrRFo1GtWbNGxcXFWrx4sQ4dOiRJ6uvrUyAQkM/nU0VFhRKJxAQvfV4ymVRJSYkqKyslZf/mRCKh\n2tpaFRUVye/369KlS1m9ubGxUcXFxVqyZIk2b96sR48eZfXefysj0SeTSX322Wc6d+6cfv75Z504\ncUKdnZ2ZeKq0TZ06VQcOHNCNGzfU0dGhI0eOqLOzU8FgUIFAQF1dXSovL1cwGJzoqc9pamqS3+8f\n/A1Jtm/evn271q9fr87OTl27dk2FhYVZuzkSiejo0aMKh8O6fv26ksmkmpubs3ZvWtwMaG9vd9et\nWzf4dWNjo9vY2JiJpxoz7733nnv+/Hl30aJFbm9vr+u6rhuLxdxFixZN8LKhotGoW15e7l64cMHd\nsGGD67puVm9OJBLu/Pnzn/t+tm6+c+eO6/P53L6+Pvfx48fuhg0b3G+//TZr96YjI6/0PT09ys/P\nH/za6/Wqp6cnE081JiKRiK5cuaKVK1cqHo/L4/FIkjwej+Lx+ASvG2rnzp3av3+/pkx5+r8umzd3\nd3dr1qxZ2rp1q1asWKGPP/5Yf/31V9ZunjFjhnbt2qV58+Zpzpw5mj59ugKBQNbuTUdGop9MH8y5\nf/++ampq1NTUpGnTpg25zXGcrPpvOXPmjHJzc1VSUvLSz0Fk2+YnT54oHA7r008/VTgc1quvvvrc\nqXE2bb5165YOHjyoSCSi33//Xffv39fx48eH3Ceb9qYjI9HPnTtX0Wh08OtoNCqv15uJpxqVx48f\nq6amRnV1daqurpY08FO8t7dXkhSLxZSbmzuRE4dob29XS0uL5s+fr48++kgXLlxQXV1dVm/2er3y\ner0qKyuTJNXW1iocDisvLy8rN1++fFmrVq3SzJkzlZOTo40bN+rixYtZuzcdGYm+tLRUN2/eVCQS\nUX9/v06ePKmqqqpMPFXaXNfVtm3b5Pf7tWPHjsHvV1VVKRQKSZJCodDgD4NssHfvXkWjUXV3d6u5\nuVlr167VsWPHsnpzXl6e8vPz1dXVJUlqbW1VcXGxKisrs3JzYWGhOjo69PDhQ7muq9bWVvn9/qzd\nm5ZMvVlw9uxZ1+fzuQsWLHD37t2bqadJ2/fff+86juMuW7bMXb58ubt8+XL3m2++ce/cueOWl5e7\nCxcudAOBgHv37t2JnvpCbW1tbmVlpeu6btZv/umnn9zS0lJ36dKl7vvvv+8mEoms3rxv3z7X7/e7\nixcvdrds2eL29/dn9d5/K2P/4AZAduITeYAxRA8YQ/SAMUQPGEP0gDFEDxjzXzu8VJ3czBXTAAAA\nAElFTkSuQmCC\n"
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It would be nice to do this even more instinctively, seeing the image right after typing its name, like the interpreter shows the output of the `__repr__()` method, if present, as illustrated in this example: "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from datetime import datetime\n",
"\n",
"class Foo(object):\n",
" pass\n",
"\n",
"class Bar(object):\n",
" \n",
" def __init__(self):\n",
" self.birthdate = datetime.now()\n",
" \n",
" def __repr__(self):\n",
" bd = self.birthdate\n",
" args = (self.__class__.__name__, hex(id(self)), bd.isoformat(), bd.strftime(\"%A\"))\n",
" return \"%s instance at %s born on %s (a %s)\" % args\n",
" \n",
"f = Foo()\n",
"b = Bar()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 4,
"text": [
"<__main__.Foo at 0x1050bda10>"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 5,
"text": [
"Bar instance at 0x1050bda50 born on 2013-03-14T16:38:24.088012 (a Thursday)"
]
}
],
"prompt_number": 5
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"PIL images"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We would like to have that immediate effect for PIL images, too! So we don't get a nasty text line like this, but the real image:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from PIL import Image\n",
"from PIL.ImageDraw import Draw\n",
"img = Image.new(\"RGBA\", (100, 100))\n",
"draw = Draw(img)\n",
"draw.rectangle(((0,0), (100, 100)), fill=(255, 100, 0))\n",
"# img.save(\"foo.png\")\n",
"img"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 6,
"text": [
"<PIL.Image.Image image mode=RGBA size=100x100 at 0x1050C50E0>"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To get this done we just have to write an IPython *display hook* for the required object type (a PIL image) and register it with IPython: "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from io import BytesIO\n",
"\n",
"from IPython.core import display\n",
"from PIL import Image\n",
"\n",
"\n",
"def display_pil_image(im):\n",
" \"\"\"Displayhook function for PIL Images, rendered as PNG.\"\"\"\n",
"\n",
" b = BytesIO()\n",
" im.save(b, format='png')\n",
" data = b.getvalue()\n",
"\n",
" ip_img = display.Image(data=data, format='png', embed=True)\n",
" return ip_img._repr_png_()\n",
"\n",
"\n",
"# register display func with PNG formatter:\n",
"png_formatter = get_ipython().display_formatter.formatters['image/png']\n",
"dpi = png_formatter.for_type(Image.Image, display_pil_image)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can just enter the identifier of a PIL image in a notebook cell, hit &lt;ENTER&gt; and it is shown in the next cell:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from PIL import Image\n",
"from PIL.ImageDraw import Draw\n",
"img = Image.new(\"RGBA\", (100, 100))\n",
"draw = Draw(img)\n",
"draw.rectangle(((0,0), (100, 100)), fill=(255, 100, 0))\n",
"# img.save(\"foo.png\")\n",
"img"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABAUlEQVR4nO3RMQ0AIADAMEAr/i3A\njQJ2tAqWbJ49ziBj/Q7gZUiMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGG\nxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgS\nY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iM\nITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGG\nxBgSY0iMITEXHzYDKkM8ThUAAAAASUVORK5CYII=\n",
"prompt_number": 8,
"text": [
"<PIL.Image.Image image mode=RGBA size=100x100 at 0x1050C0248>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"And now for something completely different (well...)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Graphics can be created in many ways before it is exported into a bitmap or vector format. ReportLab Drawings are one (more) way to do that. If you don't have it installed already, now is the time to do so:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!pip install reportlab"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Requirement already satisfied (use --upgrade to upgrade): reportlab in /opt/lib/python2.7/site-packages\r\n",
"Cleaning up...\r\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, again, IPython knows nothing about these drawings:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from reportlab.lib import colors\n",
"from reportlab.graphics import renderPM\n",
"from reportlab.graphics.shapes import Drawing, Rect\n",
"\n",
"drawing = Drawing(100, 100)\n",
"drawing.add(Rect(0, 0, 100, 100, strokeColor=None, fillColor=colors.orange))\n",
"\n",
"drawing"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 10,
"text": [
"<reportlab.graphics.shapes.Drawing instance at 0x105367c20>"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sure, we could convert a drawing to a PIL image (or even a bitmap) first, but that means one more function to remember and use (and type). And it will be likely specific to the graphics tool used:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"img = renderPM.drawToPIL(drawing)\n",
"\n",
"img"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAA6UlEQVR4nO3QQQ3AIADAQMC/DXSC\nhfVFltwpaDrPHny0Xgf8iVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZ\ngVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmB\nWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZ\ngVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWcEFVewCbMCCAcAAAAAASUVO\nRK5CYII=\n",
"prompt_number": 11,
"text": [
"<PIL.Image.Image image mode=RGB size=100x100 at 0x1054B5290>"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Yes, one could define a function similar to `imshow()` for Drawings, but that would not be very helpful if we only want to type an identifier name:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"drshow = lambda d: imshow(numpy.asarray(renderPM.drawToPIL(drawing)))\n",
"drshow(drawing)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 12,
"text": [
"<matplotlib.image.AxesImage at 0x1054f84d0>"
]
},
{
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 12
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So, again, we simply want to type e.g. `img` and *see* the real thing. And, again, an IPython display hook, now for Reportlab Drawings is what we need:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from io import BytesIO\n",
"\n",
"from IPython.core import display\n",
"\n",
"from reportlab.graphics import renderPM\n",
"from reportlab.graphics.shapes import Drawing\n",
"\n",
"\n",
"def display_reportlab_drawing(drawing):\n",
" \"\"\"displayhook function for ReportLab drawing, rendered as PNG\"\"\"\n",
"\n",
" buff = BytesIO()\n",
" renderPM.drawToFile(drawing, buff, fmt='png', dpi=72)\n",
" data = buff.getvalue()\n",
"\n",
" ip_img = display.Image(data=data, format='png', embed=True)\n",
" return ip_img._repr_png_()\n",
"\n",
"\n",
"# register display func with PNG formatter:\n",
"png_formatter = get_ipython().display_formatter.formatters['image/png']\n",
"drd = png_formatter.for_type(Drawing, display_reportlab_drawing)\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And there we go:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"drawing"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"png": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAA6UlEQVR4nO3QQQ3AIADAQMC/DXSC\nhfVFltwpaDrPHny0Xgf8iVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZ\ngVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmB\nWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZ\ngVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWYFZgVmBWcEFVewCbMCCAcAAAAAASUVO\nRK5CYII=\n",
"prompt_number": 14,
"text": [
"<reportlab.graphics.shapes.Drawing instance at 0x105367c20>"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"BTW, there are some pre-built Reportlab widgets that we can see this way, too. This is illustrated here with some (only slightly modified) code taken from the testsuite:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from reportlab.graphics.shapes import Drawing, Group\n",
"from reportlab.graphics.widgets.signsandsymbols import SmileyFace\n",
"\n",
"def getDrawing11():\n",
"\n",
" def makeSmiley(x, y, size, color):\n",
" \"Make a smiley data item representation.\"\n",
" d = size\n",
" s = SmileyFace()\n",
" s.fillColor = color\n",
" s.x = x-d\n",
" s.y = y-d\n",
" s.size = d*2\n",
" return s\n",
"\n",
" D = Drawing(400, 200)\n",
" g = Group(transform=(1,0,0,1,0,0))\n",
" g.add(makeSmiley(100,100,50,colors.red))\n",
" D.add(g)\n",
" g = Group(transform=(2,0,0,2,100,-100))\n",
" g.add(makeSmiley(100,100,40,colors.blue))\n",
" D.add(g)\n",
" g = Group(transform=(2,0,0,2,0,0))\n",
" return D"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"getDrawing11()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"png": "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\nREXJAAAAAElFTkSuQmCC\n",
"prompt_number": 16,
"text": [
"<reportlab.graphics.shapes.Drawing instance at 0x10581d560>"
]
}
],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Happy visualizing!"
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Exercise"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Write a display hook for `Color` objects defined in `reportlab.lib.colors`. Try to reuse their existing `__repr__()` method:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from reportlab.lib.colors import HexColor\n",
"c = HexColor(\"#ffaa00\")\n",
"c"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 17,
"text": [
"Color(1,.666667,0,1)"
]
}
],
"prompt_number": 17
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment