2012-09-20 101 views
3

我正在研究一个项目,我想显示一个看起来像条形图的直线直方图,除了条形图中的每一行都代表一个像素及其灰度值。绘制图形直方图

我有一个阵列全灰度值的,我只是需要把它们放进这个柱状图,并使其显示其将代表值的行..有点像这个

IMAGE    [minimize][maximize][close] 



    picture    histogram 

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

[open][save] 

及以下的加载数组的代码...我只需要得到一些代码,将使用这些灰度值,并将它们表示为上面的条形图。

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(); 
     } 

} 

我知道我必须做这样的事情......

 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]]++; 

但我不知道从那里或如何绘制图表中的数据去。

+1

的[JFreeChart的(http://www.jfree.org/jfreechart/)库有一个直方图小部件,你可能想看看。 –

+1

你可能想看看[Trail:二维图形:绘制几何图元](http://docs.oracle.com/javase/tutorial/2d/geometry/primitives.html) – Baz

回答

6

喜欢的东西

enter image description here

也许?

就个人而言,我还是会使用类似JFreeChart,但是这是一个有趣的小练习......

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(); 
      } 
     } 
    } 
} 
+0

嗯那种我需要大声笑但是代码非常感谢。 – Ignacious