3

我们正在使用 JFreeChart 构建一个引擎来显示图表。这是一个在 Tomcat + Java 1.5.0 上运行的 Web 服务,并将图表呈现为 PNG 和 JPEG(使用 ChartUtilities.writeChartAs{PNG,JPEG}() )。

我们遇到了一个问题,JFreeChart 似乎可以缩放绘图区域内的所有内容,但仅缩放几个像素。结果是图表看起来不一致,例如:

  • 次要刻度有时会水平拉伸,因此它们似乎是两个像素宽而不是一个。
  • 我们使用绘图区域右上角的小图像作为水印。这在其中间附近(但不完全是)某处水平和垂直拉伸了一个像素。
  • 背景网格线似乎出现在亚像素边界上。我还没有找到一种方法来创建一个准确的虚线网格线。

我们已经尝试了 1.0.9 和 1.0.13,结果完全相同(除了在旧版本中没有的次要滴答声)。此外,将图像渲染到帧而不是 JPEG/PNG 会产生相同的结果。

非常感谢您的帮助,提前:)

编辑:SSCCE:

@Test
public void testScaling1() throws InterruptedException {

    // Load Image:
    Component dummy = new Component() {};
    MediaTracker tracker = new MediaTracker(dummy);
    Image img = Toolkit.getDefaultToolkit().getImage("C:\\My\Image.gif");
    tracker.addImage(img, 0);
    tracker.waitForAll();

    // Build Data set and base chart.
    TimeSeriesCollection dataset = new TimeSeriesCollection();

    TimeSeries ts = new TimeSeries("Sample");
    ts.add(new Second(0, 0, 0, 1, 1, 1900), 1.0);
    ts.add(new Second(1, 0, 0, 1, 1, 1900), 3.0);
    ts.add(new Second(2, 0, 0, 1, 1, 1900), 4.0);
    ts.add(new Second(3, 0, 0, 1, 1, 1900), 2.0);

    dataset.addSeries(ts);

    JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "blabla",
            null,
            null,
            dataset,
            true,
            true,
            false
    );

    // Add BG image in top-right corner.
    XYPlot xy = chart.getXYPlot();
    xy.setBackgroundAlpha(0.0F);
    xy.setBackgroundImage(img);
    xy.setBackgroundImageAlignment(Align.NORTH_WEST);
    xy.setBackgroundImageAlpha(1.0F);

    paintChart(chart);

}

使用带有小字体文本或网格的图像。这将显示背景图像的缩放效果。

编辑 2:我们采用子类化或代理渲染器并在其 drawItem() (或类似)方法中在文本中绘制标签。这很好用。然而,小刻度现在是一个问题——它们似乎也在扩大。例如:查看第 9 和第 15 个刻度。

看看底部 http://img14.imageshack.us/img14/3625/76676732.jpg

4

1 回答 1

1

我无法使用以下代码重现您使用 1.0.13、Java 1.5、Mac OS XsaveChartAsJPEG()或使用版本描述的效果:writeChartAsPNG()

try {
    ChartUtilities.writeChartAsPNG(new FileOutputStream(
        new File("test.png")), chart, 600, 400);
} catch (IOException ex) {
    ex.printStackTrace();
}

屏幕是否显示相同的伪影?当您更改WIDTHHEIGHT参数或省略水印时会发生什么?您是否使用具有不寻常指标的特殊字体?您是否尝试过不同的平台?

您可以TimeSeriesChartDemo1按如下方式运行:

java -cp jfreechart-1.0.13.jar:jcommon-1.0.16.jar org.jfree.chart.demo.TimeSeriesChartDemo1

Mac OS 10.5.8、Java 1.5.0_24、JFreeChart 1.0.13、TimeSeriesDemo1saveChartAsPNG(),使用ImageIO.read()setBackgroundImage(). setBackgroundImageAlignment(Align.NORTH_WEST)不过有点时髦。

替代文字

于 2010-05-25T16:27:25.143 回答