/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.api.gui.util; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Stroke; import java.awt.image.RenderedImage; import javax.media.jai.iterator.RectIter; import javax.media.jai.iterator.RectIterFactory; import javax.swing.JPanel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The Class PickerView. * */ @SuppressWarnings("serial") public class PickerView extends JPanel { private static final Logger LOGGER = LoggerFactory.getLogger(PickerView.class); private int matrixSize = 3; private Rectangle area = null; private int nbBand; private RectIter rectIter; private final PickerOwner pickerOwner; private RenderedImage imageView; private RenderedImage imageData; public PickerView(PickerOwner pickerOwner) { this.pickerOwner = pickerOwner; this.setPreferredSize(new Dimension(21, 21)); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (!(g instanceof Graphics2D) || area == null) { return; } Graphics2D g2d = (Graphics2D) g; Color oldColor = g2d.getColor(); Stroke oldStroke = g2d.getStroke(); drawPickerColor(g2d); g2d.setColor(oldColor); g2d.setStroke(oldStroke); } private void drawPickerColor(Graphics2D g2d) { if (rectIter != null) { int[] c = { 0, 0, 0 }; rectIter.startBands(); rectIter.startLines(); int y = 0; while (!rectIter.finishedLines()) { rectIter.startPixels(); int x = 0; while (!rectIter.finishedPixels()) { rectIter.getPixel(c); if (nbBand == 1) { g2d.setColor(new Color(c[0], c[0], c[0])); } else { g2d.setColor(new Color(c[0], c[1], c[2])); } g2d.fillRect(x * 7, y * 7, 7, 7); rectIter.nextPixel(); x++; } rectIter.nextLine(); y++; } } } protected int[][] getValueFromArea() { RectIter it; try { it = RectIterFactory.create(imageData, area); } catch (Exception ex) { LOGGER.error("Create image data iterator", ex); //$NON-NLS-1$ it = null; } int[][] val = null; if (it != null) { val = new int[area.width * area.height][imageData.getSampleModel().getNumBands()]; int[] c = { 0, 0, 0 }; it.startBands(); it.startLines(); int y = 0; while (!it.finishedLines()) { it.startPixels(); int x = 0; while (!it.finishedPixels()) { it.getPixel(c); for (int i = 0; i < imageData.getSampleModel().getNumBands(); i++) { val[y * area.width + x][i] = c[i]; } it.nextPixel(); x++; } it.nextLine(); y++; } } return val; } public int getMatrixSize() { return matrixSize; } public void setMatrixSize(int matrixSize) { this.matrixSize = matrixSize; } public void setImageView(RenderedImage imageView) { this.imageView = imageView; } public void setImageData(RenderedImage imageData) { this.imageData = imageData; } public RenderedImage getImageData() { return imageData; } public RenderedImage getImageView() { return imageView; } public void setArea(Rectangle area, boolean updateTresh) { this.area = area; try { rectIter = RectIterFactory.create(imageView, area); nbBand = imageView.getSampleModel().getNumBands(); } catch (Exception ex) { LOGGER.error("Create image data iterator", ex); //$NON-NLS-1$ rectIter = null; } repaint(); if (updateTresh && area != null) { pickerOwner.setPickerValues(getValueFromArea(), area); } } }