3

JFreeChart を使用して、グラフを表示するエンジンを構築しています。これは、Tomcat + Java 1.5.0 で実行される Web サービスであり、チャートを PNG および JPEG にレンダリングします ( ChartUtilities.writeChartAs{PNG,JPEG}() を使用)。

JFreeChart がプロット領域内のすべてをスケーリングしているように見えますが、数ピクセルしかスケーリングしていないという問題に遭遇しました。その結果、グラフに一貫性がなくなります。たとえば、次のようになります。

  • マイナー ティックは水平方向に引き伸ばされることがあるため、幅が 1 ピクセルではなく 2 ピクセルのように見えます。
  • プロット領域の右上にある小さな画像を透かしとして使用します。これは、水平方向および垂直方向に 1 ピクセル分、中央付近 (ただし正確ではない) に引き伸ばされます。
  • サブピクセル境界に背景のグリッド線が表示されているように見えます。正確な点線のグリッド ラインを作成する方法が見つかりません。

1.0.9 と 1.0.13 の両方を試しましたが、まったく同じ結果が得られました (古いバージョンでは利用できなかった小さな目盛りを除いて)。また、画像を JPEG/PNG の代わりに Frame にレンダリングしても、同じ結果が得られました。

事前に助けていただければ幸いです:)

編集: 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、MacOSXのいずれsaveChartAsJPEG()かを使用して説明した効果を再現することはできません。writeChartAsPNG()

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

画面に同じアーティファクトが表示されますか?WIDTHおよびパラメータを変更しHEIGHTたり、透かしを省略したりするとどうなりますか?異常なメトリックを持つ特別なフォントを使用していますか?別のプラットフォームを試しましたか?

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)でも少しファンキーです。

代替テキスト

于 2010-05-25T16:27:25.143 に答える