绘制图形直方图

我正在研究一个项目,我希望显示一个看起来像条形图的单线直方图,条形图中的每一行代表一个像素及其灰度值。

我有一个充满灰度值的数组,我只需要将它们放入这个直方图并让它显示代表值的行……有点像这样

IMAGE [minimize][maximize][close] picture histogram I (Loaded Picture) II III IIII [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]]++; 

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

就像是

在此处输入图像描述

也许??

就个人而言,我仍然使用像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 mapHistory = new TreeMap(); 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 mapHistory; public Graph(Map 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(); } } } }