#!/usr/bin/env python # encoding: utf-8 # kivy_memory_image.py # How to load an image from memory in Kivy # http://mornie.org/blog/2013/11/06/how-load-image-memory-kivy/ # Copyright (c) 2013, Daniele Tricoli # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the . # 4. Neither the name of the nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY ''AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import StringIO from matplotlib.backends.backend_agg import FigureCanvasAgg from matplotlib.figure import Figure import numpy as np from kivy.app import App from kivy.core.image.img_pygame import ImageLoaderPygame from kivy.properties import ObjectProperty from kivy.uix.image import Image def cardioid(start, stop, step): """A rotated cardioid.""" theta = np.arange(start, stop, step) r = 1 - np.sin(theta) return theta, r def polar_plot(theta, r, rmax): """Draw a polat plot. :returns: matplotlib.Figure """ fig = Figure(facecolor='white') ax = fig.add_subplot(111, polar=True, frameon=False) ax.grid(False) ax.set_xticklabels([]) ax.set_yticklabels([]) ax.plot(theta, r, color='g', linewidth=2) ax.set_rmax(rmax) return fig def fig2png(fig): """Convert a matplotlib.Figure to PNG image. :returns: PNG image bytes """ data = StringIO.StringIO() canvas = FigureCanvasAgg(fig) canvas.print_png(data) return data.getvalue() class MemoryImage(Image): """Display an image already loaded in memory.""" memory_data = ObjectProperty(None) def __init__(self, memory_data, **kwargs): super(MemoryImage, self).__init__(**kwargs) self.memory_data = memory_data def on_memory_data(self, *args): """Load image from memory.""" data = StringIO.StringIO(self.memory_data) with self.canvas: self.texture = ImageLoaderPygame(data).texture class TestApp(App): def build(self): return MemoryImage(self.options['image']) if __name__ == '__main__': theta, r = cardioid(0, 8.0, 0.01) image = fig2png(polar_plot(theta, r, 2.5)) TestApp(image=image).run()