/usr/lib/python3/dist-packages/ginga/RGBImage.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 | #
# RGBImage.py -- Abstraction of an generic data image.
#
# This is open-source software licensed under a BSD license.
# Please see the file LICENSE.txt for details.
#
from ginga import trcalc
from ginga.util import io_rgb
from ginga.misc import Bunch
from ginga.BaseImage import BaseImage, ImageError, Header
import numpy
class RGBImage(BaseImage):
def __init__(self, data_np=None, metadata=None,
logger=None, name=None, order=None,
ioclass=io_rgb.RGBFileHandler):
BaseImage.__init__(self, data_np=data_np, metadata=metadata,
logger=logger, name=name)
self.io = ioclass(self.logger)
self._calc_order(order)
self.hasAlpha = 'A' in self.order
def get_slice(self, ch):
data = self._get_data()
return data[..., self.order.index(ch.upper())]
def has_slice(self, ch):
return ch.upper() in self.order
def get_order(self):
return self.order
def get_order_indexes(self, cs):
cs = cs.upper()
return [ self.order.index(c) for c in cs ]
def get_array(self, order):
order = order.upper()
if order == self.order:
return self._get_data()
l = [ self.get_slice(c) for c in order ]
return numpy.dstack(l)
def _calc_order(self, order):
if order is not None:
self.order = order.upper()
else:
# TODO; need something better here than a guess!
depth = self.get_depth()
if depth == 1:
self.order = 'M'
elif depth == 2:
self.order = 'AM'
elif depth == 3:
self.order = 'RGB'
elif depth == 4:
self.order = 'RGBA'
def set_data(self, data_np, order=None, **kwdargs):
super(RGBImage, self).set_data(data_np, **kwdargs)
self._calc_order(order)
def set_color(self, r, g, b):
# TODO: handle other sizes
ch_max = 255
red = self.get_slice('R')
red[:] = int(ch_max * r)
grn = self.get_slice('G')
grn[:] = int(ch_max * g)
blu = self.get_slice('B')
blu[:] = int(ch_max * b)
def load_file(self, filepath):
kwds = Header()
metadata = { 'header': kwds, 'path': filepath }
# TODO: ideally we would be informed by channel order
# in result by io_rgb
data_np = self.io.load_file(filepath, kwds)
self.set_data(data_np, metadata=metadata)
if not (self.name is None):
self.set(name=self.name)
def save_as_file(self, filepath):
data = self._get_data()
hdr = self.get_header()
self.io.save_file_as(filepath, data, hdr)
def get_buffer(self, format, output=None):
"""Get image as a buffer in (format).
Format should be 'jpeg', 'png', etc.
"""
return self.io.get_buffer(self._get_data(), self.get_header(),
format, output=output)
def copy(self, astype=None):
other = RGBImage()
self.transfer(other, astype=astype)
return other
def has_alpha(self):
order = self.get_order()
return 'A' in order
def insert_alpha(self, pos, alpha):
if not self.has_alpha():
order = list(self.order)
l = [ self.get_slice(c) for c in order ]
wd, ht = self.get_size()
a = numpy.zeros((ht, wd), dtype=numpy.uint8)
a[:] = int(alpha)
l.insert(pos, a)
self._data = numpy.dstack(l)
order.insert(pos, 'A')
self.order = ''.join(order)
def get_scaled_cutout_wdht(self, x1, y1, x2, y2, new_wd, new_ht,
method='basic'):
newdata, (scale_x, scale_y) = trcalc.get_scaled_cutout_wdht(
self._get_data(), x1, y1, x2, y2, new_wd, new_ht,
interpolation=method, logger=self.logger)
res = Bunch.Bunch(data=newdata, scale_x=scale_x, scale_y=scale_y)
return res
def get_scaled_cutout(self, x1, y1, x2, y2, scale_x, scale_y,
method='basic'):
newdata, (scale_x, scale_y) = trcalc.get_scaled_cutout_basic(
self._get_data(), x1, y1, x2, y2, scale_x, scale_y,
interpolation=method, logger=self.logger)
res = Bunch.Bunch(data=newdata, scale_x=scale_x, scale_y=scale_y)
return res
#END
|