Estoy trabajando en un proyecto y me gustaría mostrar una sola línea de histograma que se ve como un gráfico de barras excepto de cada línea en el gráfico de barras representa un píxel y su valor de escala de grises.

Tengo una matriz completa de los valores de escala de grises, sólo tengo que poner en este histograma y que muestre las líneas que representan los valores.. como esta

IMAGE             [minimize][maximize][close]



    picture                histogram

                          I
   (Loaded Picture)       I       I
                          I  I    I
                          I  I  I I  

[open][save]

Y a continuación está el código de carga de la matriz… sólo tengo que conseguir algo de código que se va a utilizar esos valores de escala de grises y los representan como barras de arriba.

 public void showImage(File fileName) {
        Scanner scan;
        try {
            scan = new Scanner(fileName);
            typefile = scan.next();
            iname = scan.next();       
            width = scan.nextInt();
            height = scan.nextInt();
            maxshade = scan.nextInt();
            array = new int[width][height];


            for(int r = 0; r < array.length; r++){
                for(int c = 0; c < array[r].length; c++){
                    array[r][c] = scan.nextInt();                       




            imageArray = array;         
            repaint();                  


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

 }

Sé que tengo que hacer algo como…

     int hist[] = new int[256];
     for (int r = 0; r < array.length; r++)
            for (int c = 0; c < array[r].length; c++)
                hist[array[r][c]]++;

Pero no sé a dónde ir desde allí o cómo dibujar el gráfico.

InformationsquelleAutor Ignacious | 2012-09-20

1 Comentario

  1. 7

    Algo como

    Dibujo de un gráfico de histograma

    Tal vez??

    Personalmente, yo todavía uso algo como JFreeChart, pero esto fue un poco de diversión ejercicio…

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Rectangle2D;
    import java.util.Map;
    import java.util.TreeMap;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    public class TestHisogram {
    //http://stackoverflow.com/a/12520104/714968
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    new TestHisogram();
    }
    });
    }
    public TestHisogram() {
    //For this example, I just randomised some data, you would
    //Need to load it yourself...
    int width = 256;
    int height = 256;
    int[][] data = new int[width][height];
    for (int c = 0; c < height; c++) {
    for (int r = 0; r < width; r++) {
    data[c][r] = (int) (256 * Math.random());
    }
    }
    Map<Integer, Integer> mapHistory = new TreeMap<Integer, Integer>();
    for (int c = 0; c < data.length; c++) {
    for (int r = 0; r < data[c].length; r++) {
    int value = data[c][r];
    int amount = 0;
    if (mapHistory.containsKey(value)) {
    amount = mapHistory.get(value);
    amount++;
    } else {
    amount = 1;
    }
    mapHistory.put(value, amount);
    }
    }
    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.add(new JScrollPane(new Graph(mapHistory)));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
    protected class Graph extends JPanel {
    protected static final int MIN_BAR_WIDTH = 4;
    private Map<Integer, Integer> mapHistory;
    public Graph(Map<Integer, Integer> mapHistory) {
    this.mapHistory = mapHistory;
    int width = (mapHistory.size() * MIN_BAR_WIDTH) + 11;
    Dimension minSize = new Dimension(width, 128);
    Dimension prefSize = new Dimension(width, 256);
    setMinimumSize(minSize);
    setPreferredSize(prefSize);
    }
    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (mapHistory != null) {
    int xOffset = 5;
    int yOffset = 5;
    int width = getWidth() - 1 - (xOffset * 2);
    int height = getHeight() - 1 - (yOffset * 2);
    Graphics2D g2d = (Graphics2D) g.create();
    g2d.setColor(Color.DARK_GRAY);
    g2d.drawRect(xOffset, yOffset, width, height);
    int barWidth = Math.max(MIN_BAR_WIDTH,
    (int) Math.floor((float) width
    / (float) mapHistory.size()));
    System.out.println("width = " + width + "; size = "
    + mapHistory.size() + "; barWidth = " + barWidth);
    int maxValue = 0;
    for (Integer key : mapHistory.keySet()) {
    int value = mapHistory.get(key);
    maxValue = Math.max(maxValue, value);
    }
    int xPos = xOffset;
    for (Integer key : mapHistory.keySet()) {
    int value = mapHistory.get(key);
    int barHeight = Math.round(((float) value
    / (float) maxValue) * height);
    g2d.setColor(new Color(key, key, key));
    int yPos = height + yOffset - barHeight;
    //Rectangle bar = new Rectangle(xPos, yPos, barWidth, barHeight);
    Rectangle2D bar = new Rectangle2D.Float(
    xPos, yPos, barWidth, barHeight);
    g2d.fill(bar);
    g2d.setColor(Color.DARK_GRAY);
    g2d.draw(bar);
    xPos += barWidth;
    }
    g2d.dispose();
    }
    }
    }
    }
    • umm tipo de lo que yo necesitaba lol pero el código me ayudó mucho, gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here