如何在JFreeChart中禁用缩放?

3
我们正在使用JFreeChart构建一个引擎来显示图表。这是一个基于Tomcat + Java 1.5.0的Web服务,可以将图表呈现为PNG和JPEG(使用ChartUtilities.writeChartAs{PNG,JPEG}())。
我们遇到了一个问题,JFreeChart似乎会缩放Plot区域内的所有内容,但只缩小了几个像素。结果导致图形看起来不一致,例如:
- 次要刻度有时会在水平方向上被拉伸,以至于它们看起来比一个像素宽。 - 我们在绘图区域右上角使用一个小图像作为水印。在其中间附近(但不完全相同),该图像在水平和垂直方向上被拉伸了一个像素。 - 背景网格线似乎出现在子像素边界上。我没有找到创建精确虚线网格线的方法。
我们尝试过1.0.9和1.0.13,得到了完全相同的结果(除了旧版本中不可用的次要刻度)。此外,将图像呈现到Frame而不是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

2
你能否提供一个SSCCE来展示你的问题?另外,你尝试启用抗锯齿了吗?这可能会改善结果。 - Guillaume
1个回答

1

我无法使用版本1.0.13,Java 1.5,Mac OS X中的saveChartAsJPEG()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,TimeSeriesDemo1,使用saveChartAsPNG()ImageIO.read()setBackgroundImage()setBackgroundImageAlignment(Align.NORTH_WEST)有点奇怪。

alt text


  1. 问题在所有宽度和高度上都重复出现。
  2. 水印的存在或不存在并不会改变任何事情 - 我仍然看到缩放伪影。
  3. 不指定字体也不会改变情况。
  4. 我已经在几台Windows和Linux机器上运行了这个程序。
我将尝试提供一个最小的代码片段来演示这一点。
- Alex Arnon
trashgod: 你是在说TimeSeriesDemo1,还是我上面的示例(testScaling1())? - Alex Arnon
在Ubuntu上演示 TimeSeriesDemo1,如上图所示,使用了 saveChartAsPNG() - trashgod
trashgod: 感谢您的努力,但很遗憾这并没有太大帮助,因为图表区域不包含任何像我上面所说的那些需要缩放的元素。我们后来通过使用文本标签解决了问题。 - Alex Arnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接