def __init__(self, width, height): logger = log.get_logger(null=True) # We just use a ginga widget to implement the readout readout = Viewers.CanvasView(logger=logger) readout.set_desired_size(width, height) bg = colors.lookup_color('#202030') readout.set_bg(*bg) self.viewer = readout self.readout = Widgets.wrap(readout.get_widget()) self.readout.resize(width, height) canvas = readout.get_canvas() Text = canvas.get_draw_class('text') xoff, yoff = 4, 4 self.text_obj = Text(xoff, height-yoff, text='', color='lightgreen', fontsize=14, coord='canvas') canvas.add(self.text_obj, redraw=False) self.maxx = 0 self.maxy = 0 self.maxv = 0 self.fitsimage = None
def __init__(self, width, height): logger = log.get_logger(null=True) # We just use a ginga widget to implement the readout readout = Viewers.CanvasView(logger=logger) readout.name = 'readout' readout.set_desired_size(width, height) bg = colors.lookup_color('#202030') readout.set_bg(*bg) self.viewer = readout self.readout = Widgets.wrap(readout.get_widget()) self.readout.resize(width, height) canvas = readout.get_canvas() Text = canvas.get_draw_class('text') xoff, yoff = 4, 4 self.text_obj = Text(xoff, height - yoff, text='', color='lightgreen', fontsize=14, coord='window') canvas.add(self.text_obj, redraw=False) self.maxx = 0 self.maxy = 0 self.maxv = 0 self.fitsimage = None
def __get_color(self, color, alpha): clr = QColor() if isinstance(color, tuple): clr.setRgbF(color[0], color[1], color[2], alpha) else: r, g, b = colors.lookup_color(color) clr.setRgbF(r, g, b, alpha) return clr
def __init__(self, color="red"): self.color = color height = 16 width = 16 arr8 = numpy.zeros(height * width * 4).astype(numpy.uint8) stride = cairo.ImageSurface.format_stride_for_width(cairo.FORMAT_ARGB32, width) surface = cairo.ImageSurface.create_for_data(arr8, cairo.FORMAT_ARGB32, width, height, stride) cr = cairo.Context(surface) # Fill square with full transparency cr.rectangle(0, 0, width, height) cr.set_source_rgba(0.0, 0.0, 0.0, 0.0) cr.fill() # Set cursor color r, g, b = colors.lookup_color(color) # Something I don't get about Cairo--why do I have to specify # BGRA for a method called set_source_RGBA &%^%*($ !!! # cr.set_source_rgba(r, g, b, 1.0) cr.set_source_rgba(b, g, r, 1.0) cr.set_line_width(1) # NOTE: ".5" coordinates are to get sharp, single pixel lines # due to the way Cairo renders--more ^&$%(*@ !! # See http://cairographics.org/FAQ/#sharp_lines cr.move_to(0, 6.5) cr.line_to(5, 6.5) cr.move_to(0, 8.5) cr.line_to(5, 8.5) cr.move_to(10, 6.5) cr.line_to(15, 6.5) cr.move_to(10, 8.5) cr.line_to(15, 8.5) cr.move_to(6.5, 0) cr.line_to(6.5, 5) cr.move_to(8.5, 0) cr.line_to(8.5, 5) cr.move_to(6.5, 10) cr.line_to(6.5, 15) cr.move_to(8.5, 10) cr.line_to(8.5, 15) cr.stroke() data = arr8.reshape((height, width, 4)) try: pixbuf = gtk.gdk.pixbuf_new_from_array(data, gtk.gdk.COLORSPACE_RGB, 8) except Exception, e: # print "ERROR MAKING PIXBUF", str(e) # pygtk might have been compiled without numpy support daht, dawd, depth = data.shape rgb_buf = data.tostring(order="C") pixbuf = gtk.gdk.pixbuf_new_from_data(rgb_buf, gtk.gdk.COLORSPACE_RGB, False, 8, dawd, daht, dawd * 3)
def __get_color(self, color, alpha): if isinstance(color, str) or isinstance(color, type(u"")): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 3-tuple of RGB values as floats # between 0 and 1 r, g, b = color[:3] else: r, g, b = 1.0, 1.0, 1.0 return (r, g, b, alpha)
def __get_color(self, color, alpha): if isinstance(color, str): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 3-tuple of RGB values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 return (r, g, b, alpha)
def get_color(self, color, alpha): if isinstance(color, str): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 4-tuple of RGBA values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 return (r, g, b, alpha)
def get_color(self, color, alpha=1.0): if isinstance(color, str) or isinstance(color, type(u"")): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 3-tuple of RGB values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 return (int(r * 255), int(g * 255), int(b * 255), int(alpha * 255))
def get_color(self, color): if isinstance(color, str) or isinstance(color, type(u"")): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 3-tuple of RGB values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 return (int(r * 255), int(g * 255), int(b * 255))
def set_color(self, cr, color): if isinstance(color, str): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 3-tuple of RGB values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 cr.set_source_rgb(r, g, b)
def masktorgb(mask, color='lightgreen', alpha=1.0): """Convert boolean mask to RGB image object for canvas overlay. Parameters ---------- mask : ndarray Boolean mask to overlay. 2D image only. color : str Color name accepted by Ginga. alpha : float Opacity. Unmasked data are always transparent. Returns ------- rgbobj : RGBImage RGB image for canvas Image object. Raises ------ ValueError Invalid mask dimension. """ mask = numpy.asarray(mask) if mask.ndim != 2: raise ValueError('ndim={0} is not supported'.format(mask.ndim)) ht, wd = mask.shape r, g, b = colors.lookup_color(color) rgbobj = RGBImage(data_np = numpy.zeros((ht, wd, 4), dtype=numpy.uint8)) rc = rgbobj.get_slice('R') gc = rgbobj.get_slice('G') bc = rgbobj.get_slice('B') ac = rgbobj.get_slice('A') ac[:] = 0 # Transparent background rc[mask] = int(r * 255) gc[mask] = int(g * 255) bc[mask] = int(b * 255) ac[mask] = int(alpha * 255) # For debugging #rgbobj.save_as_file('ztmp_rgbobj.png') return rgbobj
def masktorgb(mask, color='lightgreen', alpha=1.0): """Convert boolean mask to RGB image object for canvas overlay. Parameters ---------- mask : ndarray Boolean mask to overlay. 2D image only. color : str Color name accepted by Ginga. alpha : float Opacity. Unmasked data are always transparent. Returns ------- rgbobj : RGBImage RGB image for canvas Image object. Raises ------ ValueError Invalid mask dimension. """ mask = np.asarray(mask) if mask.ndim != 2: raise ValueError('ndim={0} is not supported'.format(mask.ndim)) ht, wd = mask.shape r, g, b = colors.lookup_color(color) rgbobj = RGBImage(data_np=np.zeros((ht, wd, 4), dtype=np.uint8)) rc = rgbobj.get_slice('R') gc = rgbobj.get_slice('G') bc = rgbobj.get_slice('B') ac = rgbobj.get_slice('A') ac[:] = 0 # Transparent background rc[mask] = int(r * 255) gc[mask] = int(g * 255) bc[mask] = int(b * 255) ac[mask] = int(alpha * 255) # For debugging #rgbobj.save_as_file('ztmp_rgbobj.png') return rgbobj
def get_color(self, color, alpha=1.0): if isinstance(color, str): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 3-tuple of RGB values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 # According to documentation, OpenCV expects colors as BGRA tuple # BUT, seems we need to specify RGBA--I suppose we need to match # what is defined as _rgb_order attribute in ImageViewCv class #return (int(alpha*255), int(b*255), int(g*255), int(r*255)) return (int(r*255), int(g*255), int(b*255), int(alpha*255))
def get_color(self, color, alpha=1.0): if isinstance(color, str) or isinstance(color, type(u"")): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 3-tuple of RGB values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 # According to documentation, OpenCV expects colors as BGRA tuple # BUT, seems we need to specify RGBA--I suppose we need to match # what is defined as rgb_order attribute in ImageViewCv class #return (int(alpha*255), int(b*255), int(g*255), int(r*255)) return (int(r * 255), int(g * 255), int(b * 255), int(alpha * 255))
def get_color(self, color, alpha): if isinstance(color, str): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 4-tuple of RGBA values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 # from the Bokeh docs: # "a 4-tuple of (r,g,b,a) where r, g, b are integers between # 0 and 255 and a is a floating point value between 0 and 1" ri, gi, bi = int(255 * r), int(255 * g), int(255 * b) return (ri, gi, bi, alpha)
def get_color(self, color, alpha): if isinstance(color, str): r, g, b = colors.lookup_color(color) elif isinstance(color, tuple): # color is assumed to be a 4-tuple of RGBA values as floats # between 0 and 1 r, g, b = color else: r, g, b = 1.0, 1.0, 1.0 # from the Bokeh docs: # "a 4-tuple of (r,g,b,a) where r, g, b are integers between # 0 and 255 and a is a floating point value between 0 and 1" ri, gi, bi = int(255*r), int(255*g), int(255*b) return (ri, gi, bi, alpha)
def _get_rgb255_from_color(self, color): """Get the rgb values normalized between 0 and 255 given a color Parameters ---------- color : :obj:`str` Name of a color in :attr:`colors` Returns ------- rgb : :obj:`list` of four :obj:`float` The red, green, and blue values normalized between 0 and 255 """ rgb = np.array(ginga_colors.lookup_color(color)) * 255. return rgb
def _plotpoints(self, obj, color): image = self.fitsimage.get_image() # Get points on the line if obj.kind == 'line': if self.widthtype == 'none': points = image.get_pixels_on_line(int(obj.x1), int(obj.y1), int(obj.x2), int(obj.y2)) else: coords = image.get_pixels_on_line(int(obj.x1), int(obj.y1), int(obj.x2), int(obj.y2), getvalues=False) points = [] for x, y in coords: arr = self.get_orthogonal_array(image, obj, x, y, self.width_radius) val = numpy.nansum(arr) points.append(val) elif obj.kind in ('path', 'freepath'): points = [] x1, y1 = obj.points[0] for x2, y2 in obj.points[1:]: pts = image.get_pixels_on_line(int(x1), int(y1), int(x2), int(y2)) # don't repeat last point when adding next segment points.extend(pts[:-1]) x1, y1 = x2, y2 elif obj.kind == 'beziercurve': points = obj.get_pixels_on_curve(image) points = numpy.array(points) rgb = colors.lookup_color(color) self.cuts_plot.cuts(points, xtitle="Line Index", ytitle="Pixel Value", color=rgb) if self.settings.get('show_cuts_legend', False): self.add_legend()
def overlay_mask(self, maskImage, maskDict, maskAlpha): import numpy as np from ginga.RGBImage import RGBImage from ginga import colors maskArray = maskImage.getArray() height, width = maskArray.shape maskRGBA = np.zeros((height, width, 4), dtype=np.uint8) nSet = np.zeros_like(maskArray, dtype=np.uint8) for maskValue, maskColor in maskDict.items(): r, g, b = colors.lookup_color(maskColor) isSet = (maskArray & maskValue) != 0 if (isSet == 0).all(): continue maskRGBA[:, :, 0][isSet] = 255 * r maskRGBA[:, :, 1][isSet] = 255 * g maskRGBA[:, :, 2][isSet] = 255 * b nSet[isSet] += 1 maskRGBA[:, :, 3][nSet == 0] = 0 maskRGBA[:, :, 3][nSet != 0] = 255 * maskAlpha nSet[nSet == 0] = 1 for C in (0, 1, 2): maskRGBA[:, :, C] //= nSet rgb_img = RGBImage(data_np=maskRGBA) Image = self._viewer.canvas.get_draw_class('image') maskImageRGBA = Image(0, 0, rgb_img) if "mask_overlay" in self._gingaViewer.canvas.get_tags(): self._gingaViewer.canvas.delete_object_by_tag("mask_overlay") self._gingaViewer.canvas.add(maskImageRGBA, tag="mask_overlay")
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container, fill=True) vbox.set_border_width(4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Pixel Values") # We just use a ginga widget to implement the pixtable pixview = Viewers.CanvasView(logger=self.logger) width, height = 300, 300 pixview.set_desired_size(width, height) bg = colors.lookup_color('#202030') pixview.set_bg(*bg) bd = pixview.get_bindings() self.pixview = pixview self.pix_w = Viewers.ScrolledView(pixview) self.pix_w.resize(width, height) fr.set_widget(self.pix_w) vbox.add_widget(fr, stretch=1) self._rebuild_table() btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) cbox1 = Widgets.ComboBox() index = 0 for i in self.sizes: j = 1 + i * 2 name = "%dx%d" % (j, j) cbox1.append_text(name) index += 1 index = self.sizes.index(self.pixtbl_radius) cbox1.set_index(index) cbox1.add_callback('activated', self.set_cutout_size_cb) cbox1.set_tooltip("Select size of pixel table") btns.add_widget(cbox1, stretch=0) # control for selecting a mark cbox2 = Widgets.ComboBox() for tag in self.marks: cbox2.append_text(tag) if self.mark_selected is None: cbox2.set_index(0) else: cbox2.show_text(self.mark_selected) cbox2.add_callback('activated', self.mark_select_cb) self.w.marks = cbox2 cbox2.set_tooltip("Select a mark") #cbox2.setMinimumContentsLength(8) btns.add_widget(cbox2, stretch=0) btn1 = Widgets.Button("Delete") btn1.add_callback('activated', lambda w: self.clear_mark_cb()) btn1.set_tooltip("Delete selected mark") btns.add_widget(btn1, stretch=0) btn2 = Widgets.Button("Delete All") btn2.add_callback('activated', lambda w: self.clear_all()) btn2.set_tooltip("Clear all marks") btns.add_widget(btn2, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) vbox2 = Widgets.VBox() vbox2.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn3 = Widgets.CheckBox("Pan to mark") btn3.set_state(self.pan2mark) btn3.add_callback('activated', self.pan2mark_cb) btn3.set_tooltip("Pan follows selected mark") btns.add_widget(btn3) btns.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(btns, stretch=0) captions = [ ('Font size:', 'label', 'Font size', 'combobox'), ] w, b = Widgets.build_info(captions) self.w.update(b) vbox2.add_widget(w, stretch=0) b.font_size.set_tooltip("Set font size for pixel display") for size in (8, 9, 10, 11, 12, 14, 16): b.font_size.append_text(str(size)) b.font_size.show_text(str(self.fontsize)) b.font_size.add_callback('activated', self.set_font_size_cb) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=1) ## spacer = Widgets.Label('') ## vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) box, sw, orientation = Widgets.get_oriented_box(container) box.set_border_width(4) box.set_spacing(2) fr = Widgets.Frame("Pixel Values") # We just use a ginga widget to implement the pixtable pixview = Viewers.CanvasView(logger=self.logger) pixview.set_desired_size(self._wd, self._ht) bg = colors.lookup_color('#202030') pixview.set_bg(*bg) bd = pixview.get_bindings() bd.enable_zoom(True) bd.enable_pan(True) self.pixview = pixview self.pix_w = Viewers.GingaViewerWidget(pixview) fr.set_widget(self.pix_w) self.pix_w.resize(self._wd, self._ht) paned = Widgets.Splitter(orientation=orientation) self.w.splitter = paned paned.add_widget(fr) self._rebuild_table() btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) cbox1 = Widgets.ComboBox() index = 0 for i in self.sizes: j = 1 + i * 2 name = "%dx%d" % (j, j) cbox1.append_text(name) index += 1 index = self.sizes.index(self.pixtbl_radius) cbox1.set_index(index) cbox1.add_callback('activated', self.set_cutout_size_cb) cbox1.set_tooltip("Select size of pixel table") btns.add_widget(cbox1, stretch=0) # control for selecting a mark cbox2 = Widgets.ComboBox() for tag in self.marks: cbox2.append_text(tag) if self.mark_selected is None: cbox2.set_index(0) else: cbox2.show_text(self.mark_selected) cbox2.add_callback('activated', self.mark_select_cb) self.w.marks = cbox2 cbox2.set_tooltip("Select a mark") #cbox2.setMinimumContentsLength(8) btns.add_widget(cbox2, stretch=0) btn1 = Widgets.Button("Delete") btn1.add_callback('activated', lambda w: self.clear_mark_cb()) btn1.set_tooltip("Delete selected mark") btn1.set_enabled(len(self.marks) > 1) self.w.btn_delete = btn1 btns.add_widget(btn1, stretch=0) btn2 = Widgets.Button("Delete All") btn2.add_callback('activated', lambda w: self.clear_all()) btn2.set_tooltip("Clear all marks") btns.add_widget(btn2, stretch=0) btn2.set_enabled(len(self.marks) > 1) self.w.btn_delete_all = btn2 btns.add_widget(Widgets.Label(''), stretch=1) vbox2 = Widgets.VBox() vbox2.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn3 = Widgets.CheckBox("Pan to mark") btn3.set_state(self.pan2mark) btn3.add_callback('activated', self.pan2mark_cb) btn3.set_tooltip("Pan follows selected mark") btns.add_widget(btn3) btns.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(btns, stretch=0) captions = [ ('Font size:', 'label', 'Font size', 'combobox', 'Caption:', 'label', 'Caption', 'entry'), ] w, b = Widgets.build_info(captions) self.w.update(b) vbox2.add_widget(w, stretch=0) b.font_size.set_tooltip("Set font size for pixel display") for size in self.fontsizes: b.font_size.append_text(str(size)) b.font_size.show_text(str(self.fontsize)) b.font_size.add_callback('activated', self.set_font_size_cb) b.caption.set_tooltip("Text to append to the marker") vbox2.add_widget(Widgets.Label(''), stretch=1) box.add_widget(vbox2, stretch=1) ## spacer = Widgets.Label('') ## box.add_widget(spacer, stretch=1) paned.add_widget(sw) paned.set_sizes(self._split_sizes) top.add_widget(paned, stretch=1) mode = self.canvas.get_draw_mode() hbox = Widgets.HBox() btn1 = Widgets.RadioButton("Move") btn1.set_state(mode == 'move') btn1.add_callback('activated', lambda w, val: self.set_mode_cb('move', val)) btn1.set_tooltip("Choose this to add or move a mark") self.w.btn_move = btn1 hbox.add_widget(btn1) btn2 = Widgets.RadioButton("Draw", group=btn1) btn2.set_state(mode == 'draw') btn2.add_callback('activated', lambda w, val: self.set_mode_cb('draw', val)) btn2.set_tooltip("Choose this to draw a new or replacement mark") self.w.btn_draw = btn2 hbox.add_widget(btn2) btn3 = Widgets.RadioButton("Edit", group=btn1) btn3.set_state(mode == 'edit') btn3.add_callback('activated', lambda w, val: self.set_mode_cb('edit', val)) btn3.set_tooltip("Choose this to edit a mark") self.w.btn_edit = btn3 hbox.add_widget(btn3) hbox.add_widget(Widgets.Label(''), stretch=1) top.add_widget(hbox, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btn = Widgets.Button("Help") btn.add_callback('activated', lambda w: self.help()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def redo(self): hi_value_s = self.w.hi_value.get_text().strip() if len(hi_value_s) > 0: self.hi_value = float(hi_value_s) else: self.hi_value = None lo_value_s = self.w.lo_value.get_text().strip() if len(lo_value_s) > 0: self.lo_value = float(lo_value_s) else: self.lo_value = None self.logger.debug("set lo=%s hi=%s" % (self.lo_value, self.hi_value)) self.opacity = self.w.opacity.get_value() self.logger.debug("set alpha to %f" % (self.opacity)) # look up the colors self.hi_color = self.colornames[self.w.hi_color.get_index()] try: rh, gh, bh = colors.lookup_color(self.hi_color) except KeyError: self.fv.show_error("No such color found: '%s'" % (self.hi_color)) self.lo_color = self.colornames[self.w.lo_color.get_index()] try: rl, gl, bl = colors.lookup_color(self.lo_color) except KeyError: self.fv.show_error("No such color found: '%s'" % (self.lo_color)) image = self.fitsimage.get_image() if image is None: return self.logger.debug("preparing RGB image") wd, ht = image.get_size() if (wd, ht) != self.arrsize: rgbarr = np.zeros((ht, wd, 4), dtype=np.uint8) self.arrsize = (wd, ht) self.rgbobj.set_data(rgbarr) else: rgbarr = self.rgbobj.get_data() # Set array to the desired saturation color rc = self.rgbobj.get_slice('R') gc = self.rgbobj.get_slice('G') bc = self.rgbobj.get_slice('B') ac = self.rgbobj.get_slice('A') self.logger.debug("Calculating alpha channel") # set alpha channel according to saturation limit try: data = image.get_data() ac[:] = 0 if self.hi_value is not None: idx = data >= self.hi_value rc[idx] = int(rh * 255) gc[idx] = int(gh * 255) bc[idx] = int(bh * 255) ac[idx] = int(self.opacity * 255) if self.lo_value is not None: idx = data <= self.lo_value rc[idx] = int(rl * 255) gc[idx] = int(gl * 255) bc[idx] = int(bl * 255) ac[idx] = int(self.opacity * 255) except Exception as e: self.logger.error("Error setting alpha channel: %s" % (str(e))) if self.canvas_img is None: self.logger.debug("Adding image to canvas") self.canvas_img = self.dc.Image(0, 0, self.rgbobj) self.canvas.add(self.canvas_img) else: self.logger.debug("Updating canvas image") self.canvas_img.set_image(self.rgbobj) self.logger.debug("redrawing canvas") self.canvas.update_canvas() self.logger.debug("redo completed")
def redo(self): hi_value_s = self.w.hi_value.get_text().strip() if len(hi_value_s) > 0: self.hi_value = float(hi_value_s) else: self.hi_value = None lo_value_s = self.w.lo_value.get_text().strip() if len(lo_value_s) > 0: self.lo_value = float(lo_value_s) else: self.lo_value = None self.logger.debug("set lo=%s hi=%s" % (self.lo_value, self.hi_value)) self.opacity = self.w.opacity.get_value() self.logger.debug("set alpha to %f" % (self.opacity)) # look up the colors self.hi_color = self.colornames[self.w.hi_color.get_index()] try: rh, gh, bh = colors.lookup_color(self.hi_color) except KeyError: self.fv.show_error("No such color found: '%s'" % (self.hi_color)) self.lo_color = self.colornames[self.w.lo_color.get_index()] try: rl, gl, bl = colors.lookup_color(self.lo_color) except KeyError: self.fv.show_error("No such color found: '%s'" % (self.lo_color)) image = self.fitsimage.get_image() if image == None: return self.logger.debug("preparing RGB image") wd, ht = image.get_size() if (wd, ht) != self.arrsize: rgbarr = numpy.zeros((ht, wd, 4), dtype=numpy.uint8) self.arrsize = (wd, ht) self.rgbobj.set_data(rgbarr) else: rgbarr = self.rgbobj.get_data() # Set array to the desired saturation color rc = self.rgbobj.get_slice('R') gc = self.rgbobj.get_slice('G') bc = self.rgbobj.get_slice('B') ac = self.rgbobj.get_slice('A') self.logger.debug("Calculating alpha channel") # set alpha channel according to saturation limit try: data = image.get_data() ac[:] = 0 if self.hi_value != None: idx = data >= self.hi_value rc[idx] = int(rh * 255) gc[idx] = int(gh * 255) bc[idx] = int(bh * 255) ac[idx] = int(self.opacity * 255) if self.lo_value != None: idx = data <= self.lo_value rc[idx] = int(rl * 255) gc[idx] = int(gl * 255) bc[idx] = int(bl * 255) ac[idx] = int(self.opacity * 255) except Exception as e: self.logger.error("Error setting alpha channel: %s" % (str(e))) if self.canvas_img == None: self.logger.debug("Adding image to canvas") self.canvas_img = CanvasTypes.Image(0, 0, self.rgbobj) self.canvas.add(self.canvas_img, redraw=False) else: self.logger.debug("Updating canvas image") self.canvas_img.set_image(self.rgbobj) self.logger.debug("redrawing canvas") self.fitsimage.redraw(whence=2) self.logger.debug("redo completed")
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) box, sw, orientation = Widgets.get_oriented_box(container) box.set_border_width(4) box.set_spacing(2) fr = Widgets.Frame("Pixel Values") # We just use a ginga widget to implement the pixtable pixview = Viewers.CanvasView(logger=self.logger) pixview.set_desired_size(self._wd, self._ht) bg = colors.lookup_color('#202030') pixview.set_bg(*bg) bd = pixview.get_bindings() bd.enable_zoom(True) bd.enable_pan(True) self.pixview = pixview self.pix_w = Viewers.GingaViewerWidget(pixview) fr.set_widget(self.pix_w) self.pix_w.resize(self._wd, self._ht) paned = Widgets.Splitter(orientation=orientation) paned.add_widget(fr) self._rebuild_table() btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) cbox1 = Widgets.ComboBox() index = 0 for i in self.sizes: j = 1 + i * 2 name = "%dx%d" % (j, j) cbox1.append_text(name) index += 1 index = self.sizes.index(self.pixtbl_radius) cbox1.set_index(index) cbox1.add_callback('activated', self.set_cutout_size_cb) cbox1.set_tooltip("Select size of pixel table") btns.add_widget(cbox1, stretch=0) # control for selecting a mark cbox2 = Widgets.ComboBox() for tag in self.marks: cbox2.append_text(tag) if self.mark_selected is None: cbox2.set_index(0) else: cbox2.show_text(self.mark_selected) cbox2.add_callback('activated', self.mark_select_cb) self.w.marks = cbox2 cbox2.set_tooltip("Select a mark") #cbox2.setMinimumContentsLength(8) btns.add_widget(cbox2, stretch=0) btn1 = Widgets.Button("Delete") btn1.add_callback('activated', lambda w: self.clear_mark_cb()) btn1.set_tooltip("Delete selected mark") btns.add_widget(btn1, stretch=0) btn2 = Widgets.Button("Delete All") btn2.add_callback('activated', lambda w: self.clear_all()) btn2.set_tooltip("Clear all marks") btns.add_widget(btn2, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) vbox2 = Widgets.VBox() vbox2.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn3 = Widgets.CheckBox("Pan to mark") btn3.set_state(self.pan2mark) btn3.add_callback('activated', self.pan2mark_cb) btn3.set_tooltip("Pan follows selected mark") btns.add_widget(btn3) btns.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(btns, stretch=0) captions = [ ('Font size:', 'label', 'Font size', 'combobox'), ] w, b = Widgets.build_info(captions) self.w.update(b) vbox2.add_widget(w, stretch=0) b.font_size.set_tooltip("Set font size for pixel display") for size in self.fontsizes: b.font_size.append_text(str(size)) b.font_size.show_text(str(self.fontsize)) b.font_size.add_callback('activated', self.set_font_size_cb) vbox2.add_widget(Widgets.Label(''), stretch=1) box.add_widget(vbox2, stretch=1) ## spacer = Widgets.Label('') ## box.add_widget(spacer, stretch=1) paned.add_widget(sw) # hack to set a reasonable starting position for the splitter _sz = max(self._wd, self._ht) paned.set_sizes([_sz, _sz]) top.add_widget(paned, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btn = Widgets.Button("Help") btn.add_callback('activated', lambda w: self.help()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container, fill=True) vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Expander("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Pixel Values") # We just use a ginga widget to implement the pixtable pixview = Viewers.CanvasView(logger=self.logger) width, height = 300, 300 pixview.set_desired_size(width, height) bg = colors.lookup_color('#202030') pixview.set_bg(*bg) bd = pixview.get_bindings() self.pixview = pixview self.pix_w = Widgets.wrap(pixview.get_widget()) self.pix_w.resize(width, height) fr.set_widget(self.pix_w) vbox.add_widget(fr, stretch=1) self._rebuild_table() btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) cbox1 = Widgets.ComboBox() index = 0 for i in self.sizes: j = 1 + i*2 name = "%dx%d" % (j, j) cbox1.append_text(name) index += 1 index = self.sizes.index(self.pixtbl_radius) cbox1.set_index(index) cbox1.add_callback('activated', self.set_cutout_size_cb) cbox1.set_tooltip("Select size of pixel table") btns.add_widget(cbox1, stretch=0) # control for selecting a mark cbox2 = Widgets.ComboBox() for tag in self.marks: cbox2.append_text(tag) if self.mark_selected is None: cbox2.set_index(0) else: cbox2.show_text(self.mark_selected) cbox2.add_callback('activated', self.mark_select_cb) self.w.marks = cbox2 cbox2.set_tooltip("Select a mark") #cbox2.setMinimumContentsLength(8) btns.add_widget(cbox2, stretch=0) btn1 = Widgets.Button("Delete") btn1.add_callback('activated', lambda w: self.clear_mark_cb()) btn1.set_tooltip("Delete selected mark") btns.add_widget(btn1, stretch=0) btn2 = Widgets.Button("Delete All") btn2.add_callback('activated', lambda w: self.clear_all()) btn2.set_tooltip("Clear all marks") btns.add_widget(btn2, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) vbox2 = Widgets.VBox() vbox2.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn3 = Widgets.CheckBox("Pan to mark") btn3.set_state(self.pan2mark) btn3.add_callback('activated', self.pan2mark_cb) btn3.set_tooltip("Pan follows selected mark") btns.add_widget(btn3) btns.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(btns, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=1) ## spacer = Widgets.Label('') ## vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def __init__(self, session, parent=None): self.logger = log.get_logger(name='ginga', level=20, # switch commenting for debugging null=True, log_stderr=False, #null=False, log_stderr=True ) # load binding preferences if available cfgfile = os.path.join(ginga_home, "bindings.cfg") bindprefs = SettingGroup(name='bindings', logger=self.logger, preffile=cfgfile) bindprefs.load(onError='silent') bd = ImageViewBindings(self.logger, settings=bindprefs) # make Ginga viewer self.viewer = ImageViewCanvas(self.logger, render='widget', bindings=bd) self.canvas = self.viewer # prevent widget from grabbing focus self.viewer.set_enter_focus(False) self.viewer.set_desired_size(300, 300) # enable interactive features bindings = self.viewer.get_bindings() bindings.enable_all(True) self.canvas.add_callback('none-move', self.motion_readout) self.canvas.register_for_cursor_drawing(self.viewer) self.canvas.add_callback('draw-event', self._apply_roi_cb) self.canvas.add_callback('edit-event', self._update_roi_cb) self.canvas.add_callback('draw-down', self._clear_roi_cb) self.canvas.enable_draw(False) self.canvas.enable_edit(False) self.viewer.enable_autozoom('off') self.viewer.set_zoom_algorithm('rate') self.viewer.set_zoomrate(1.4) self.viewer.set_fg(*colors.lookup_color("#D0F0E0")) bm = self.viewer.get_bindmap() bm.add_callback('mode-set', self.mode_set_cb) self.mode_w = None self.mode_actns = {} # Create settings and set defaults settings = self.viewer.get_settings() self.settings = settings settings.getSetting('cuts').add_callback('set', self.cut_levels_cb) settings.set(autozoom='off', autocuts='override', autocenter='override') # make color bar, with color maps shared from ginga canvas rgbmap = self.viewer.get_rgbmap() self.colorbar = ColorBar.ColorBar(self.logger) rgbmap.add_callback('changed', self.rgbmap_cb, self.viewer) self.colorbar.set_rgbmap(rgbmap) # make coordinates/value readout self.readout = Readout.Readout(-1, 20) self.roi_tag = None self.opn_obj = None super(GingaWidget, self).__init__(session, parent)