2014-02-26 216 views
0

爲我的應用程序使用jfree圖表(折線圖)...我的圖表在創建時看起來很模糊..我如何獲得高清晰度的圖像。如何提高jfree圖表的質量(分辨率)

我用:ChartUtilities.writeScaledChartAsPNG(baos, chart, 205, 100, 4, 3);

它不工作...請建議我任何想法來做到這一點。

UPDATE 1:

final JFreeChart chart = ChartFactory.createLineChart(
        "", // chart title 
        "", // domain axis label 
        "", // range axis label 
        categoryDataset, // data 
        PlotOrientation.VERTICAL, // orientation 
        false, // include legend 
        false, // tooltips 
        false // urls 
      ); 

      chart.setBackgroundPaint(Color.WHITE); 
      final CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
      plot.setBackgroundPaint(Color.WHITE); 
      plot.setOutlineVisible(false); 
      plot.setRangeGridlinePaint(Color.white); 

      final CategoryAxis categoryAxis = plot.getDomainAxis(); 
      categoryAxis.setAxisLineVisible(false); 
      categoryAxis.setTickMarksVisible(false); 
      categoryAxis.setMaximumCategoryLabelLines(2); 
      categoryAxis.setTickLabelFont(ticklabelfont); 

      final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
      rangeAxis.setVisible(false); 
      rangeAxis.setRange(minRange, maxRange); 
      rangeAxis.setTickUnit(new NumberTickUnit(20)); 

      final LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer(); 
      categoryAxis.setTickLabelPaint(Color.decode("#222222")); 
      if (lineColorFlag) { 
       renderer.setSeriesStroke(0, new BasicStroke(1.5f)); 
      } else { 
       chart.setPadding(new RectangleInsets(0, -8, 0, 0)); 
       renderer.setSeriesStroke(0, new BasicStroke(1.2f)); 
      } 
      renderer.setBaseShapesVisible(true); 
      renderer.setBaseShapesFilled(true); 
      renderer.setSeriesItemLabelsVisible(1, Boolean.TRUE); 
      Shape circle = new Ellipse2D.Double(-3, -3, 6, 6); 
      renderer.setSeriesShape(0, circle); 
      renderer.setSeriesShape(1, null); 
      renderer.setBaseItemLabelGenerator(new CustomLabelGenerator()); 
      renderer.setItemLabelAnchorOffset(-5); 
      renderer.setBaseItemLabelsVisible(true); 
      plot.getRenderer().setSeriesPaint(0, Color.decode("#FEC240")); 
      renderer.setBaseItemLabelFont(annotationlabelfont); 
      plot.getRenderer().setSeriesPaint(1, Color.WHITE); 

      try {      
    //   BufferedImage bi = chart.createBufferedImage(205, 100);    
    //   BufferedImage image = chart.createBufferedImage(205, 100); 
    //   PngEncoder encoder = new PngEncoder(image, false, 0, 9); 
    //   encoder.setDpi(300, 300); 
    //   byte[] data = encoder.pngEncode(); 
    //   InputStream in = new ByteArrayInputStream(data); 
    //   BufferedImage bImageFromConvert = ImageIO.read(in); 
       ByteArrayOutputStream baos = new ByteArrayOutputStream();    
ChartUtilities.writeScaledChartAsPNG(baos, chart, 205, 100, 4, 3);    
       byte[] bi=baos.toByteArray(); 
       InputStream in = new ByteArrayInputStream(bi); 
       BufferedImage bImageFromConvert = ImageIO.read(in); 
       PngEncoder pngEncoder=new PngEncoder(bImageFromConvert); 

    //   ChartUtilities.writeScaledChartAsPNG(baos, chart, 205, 100, 2, 2); 
       ImageIO.write(bImageFromConvert, "png", baos); 
       byte[] byteArray = baos.toByteArray(); 

O/P圖像:

enter image description here

+0

請問您可以添加所有相關的代碼嗎? –

+0

我已添加我的代碼@SteffenNieuwenhoven – Hariprasath

+1

爲什麼不使用JavaFX?它有很好的設計圖表,可以更容易地使用。唯一的問題是將您當前的應用程序移植到那裏。這就是爲什麼這個評論只是一個建議,讓你知道JavaFX,以防你不知道它。 –

回答

2

嘗試調用plot.setShadowGenerator(空)編寫的圖表圖像之前。否則,圖的內容將被繪製到圖像上,由此產生模糊陰影,兩者將被疊加,然後將結果圖像放大到PNG輸出圖像的較大尺寸。沒有完整的信息很難說,但我想這可能是你報告模糊的原因。

還有你可以用它來抑制陰影生成一個RenderingHint:

chart.getRenderingHints().put(JFreeChart.KEY_SUPPRESS_SHADOW_GENERATION, Boolean.TRUE); 

最後一個建議 - 你考慮過使用JFreeSVG寫的圖表SVG格式?

+0

它不會影響我...我已經在我的文章中上傳了我的新圖片 – Hariprasath

+0

我不明白爲什麼您的圖片是205x100。你可以嘗試ChartUtilities.writeScaledChartAsPNG(新的FileOutputStream(新文件(「test.png」)),圖表,205,100,4,3); ?對我而言,這會創建一個圖像文件820x300。 –

+0

我需要以205 * 100的質量創建該圖表 – Hariprasath

相關問題