/usr/lib/python3/dist-packages/ginga/aggw/ImageViewAgg.py is in python3-ginga 2.6.1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | #
# ImageViewAgg.py -- a backend for Ginga using the aggdraw library
#
# This is open-source software licensed under a BSD license.
# Please see the file LICENSE.txt for details.
import numpy
from io import BytesIO
import aggdraw as agg
from . import AggHelp
from ginga import ImageView
from ginga.aggw.CanvasRenderAgg import CanvasRenderer
try:
import PIL.Image as PILimage
have_PIL = True
except ImportError:
have_PIL = False
class ImageViewAggError(ImageView.ImageViewError):
pass
class ImageViewAgg(ImageView.ImageViewBase):
def __init__(self, logger=None, rgbmap=None, settings=None):
ImageView.ImageViewBase.__init__(self, logger=logger,
rgbmap=rgbmap,
settings=settings)
self.surface = None
self._rgb_order = 'RGBA'
self.renderer = CanvasRenderer(self)
def get_surface(self):
return self.surface
def render_image(self, rgbobj, dst_x, dst_y):
"""Render the image represented by (rgbobj) at dst_x, dst_y
in the pixel space.
"""
if self.surface is None:
return
canvas = self.surface
self.logger.debug("redraw surface")
# get window contents as a buffer and load it into the AGG surface
rgb_buf = self.getwin_buffer(order=self._rgb_order)
canvas.fromstring(rgb_buf)
# for debugging
#self.save_rgb_image_as_file('/tmp/temp.png', format='png')
def configure_surface(self, width, height):
# create agg surface the size of the window
self.surface = agg.Draw("RGBA", (width, height), 'black')
# inform the base class about the actual window size
self.configure(width, height)
def get_image_as_array(self):
if self.surface is None:
raise ImageViewAggError("No AGG surface defined")
# TODO: could these have changed between the time that self.surface
# was last updated?
wd, ht = self.get_window_size()
# Get agg surface as a numpy array
surface = self.get_surface()
arr8 = numpy.fromstring(surface.tostring(), dtype=numpy.uint8)
arr8 = arr8.reshape((ht, wd, 4))
return arr8
def get_image_as_buffer(self, output=None):
if self.surface is None:
raise ImageViewAggError("No AGG surface defined")
obuf = output
if obuf is None:
obuf = BytesIO()
surface = self.get_surface()
obuf.write(surface.tostring())
return obuf
def get_rgb_image_as_buffer(self, output=None, format='png', quality=90):
if not have_PIL:
raise ImageViewAggError("Please install PIL to use this method")
if self.surface is None:
raise ImageViewAggError("No AGG surface defined")
obuf = output
if obuf is None:
obuf = BytesIO()
# Get current surface as an array
arr8 = self.get_image_as_array()
# make a PIL image
image = PILimage.fromarray(arr8)
image.save(obuf, format=format, quality=quality)
if not (output is None):
return None
return obuf.getvalue()
def get_rgb_image_as_bytes(self, format='png', quality=90):
buf = self.get_rgb_image_as_buffer(format=format, quality=quality)
return buf
def save_rgb_image_as_file(self, filepath, format='png', quality=90):
if not have_PIL:
raise ImageViewAggError("Please install PIL to use this method")
if self.surface is None:
raise ImageViewAggError("No AGG surface defined")
with open(filepath, 'w') as out_f:
self.get_rgb_image_as_buffer(output=out_f, format=format,
quality=quality)
self.logger.debug("wrote %s file '%s'" % (format, filepath))
def update_image(self):
# subclass implements this method to actually update a widget
# from the agg surface
self.logger.warning("Subclass should override this method")
return False
def set_cursor(self, cursor):
# subclass implements this method to actually set a defined
# cursor on a widget
self.logger.warning("Subclass should override this method")
def reschedule_redraw(self, time_sec):
# subclass implements this method to call delayed_redraw() after
# time_sec
self.delayed_redraw()
def get_rgb_order(self):
return self._rgb_order
#END
|