簡體   English   中英

如何提高jfree圖表的質量(分辨率)

[英]How to improve the quality(resolution) of the jfree chart

我使用jfree圖表(折線圖)為我的應用程序...我的圖表在創建時看起來模糊..我怎樣才能獲得高清晰度圖像。

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

它不起作用...請建議我這樣做的任何想法。

更新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圖像:

在此輸入圖像描述

在將圖表寫入圖像之前,請嘗試調用plot.setShadowGenerator(null)。 否則,繪圖的內容將被繪制到圖像,將生成模糊陰影,兩者將被覆蓋,然后生成的圖像將按比例放大到PNG輸出圖像的較大尺寸。 沒有完整的信息很難說,但我猜這可能是你報告的模糊性的原因。

您還可以使用RenderingHint來抑制陰影生成:

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

最后的建議 - 您是否考慮過使用JFreeSVG將圖表寫入SVG格式?

試試這個,它對我有用:

ByteArrayOutputStream bout = new ByteArrayOutputStream();
int scale =3 ; //chart will be rendered at thrice the resolution.
ChartUtilities.writeScaledChartAsPNG(bout, chart, 200, 200, scale, scale);

使用scale(int)作為您想要提高分辨率的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM