在一个JPG文件中导出多个图像

时间:2012-08-03 14:09:12

标签: java jsp bytearray jfreechart

我有一个允许用户导出一些数据的JSP。您可以选择不同的格式(excel,csv)。此外,使用excel导出对应于数据的图表(饼图,折线图和条形图)用户希望将图表导出为唯一的jpg文件。

我所做的是(全部使用Java):

  • 使用JFreeChart生成图表
  • 使用以下方法将图表转换为JPG图像:ChartUtilities.saveChartAsJPEG
  • 然后我检索图像字节:

代码:

InputStream is = null;
try {
   is = new FileInputStream(image);
}catch (FileNotFoundException e) {
   e.printStackTrace();
}
byte[] bytes = null;
try {
   bytes = IOUtils.toByteArray(is);
}catch (IOException e) {
   e.printStackTrace();
}

这很好用,我有每个图表的字节。然后我将每个图表的字节放在一个字节数组中:

byte[] imageBytes = getImageAsBytes(chart1,chart2,chart3);
res.setContentType("image/jpg");
res.setHeader("Content-Disposition", "attachment; filename=" + "MyCharts" + ".jpg");
res.setContentLength(imageBytes.length);
try{
    OutputStream output = res.getOutputStream();
    output.write(imageBytes);
    output.flush();   
    output.close();  
} catch (IOException e) {
    e.printStackTrace();
}

问题是:当我打开JPG时,只显示一个图像。我测试了每个图表的导出并运行良好,但是当我放置所有图表字节时,只显示一个图像(始终是imageBytes数组中的第一个)

我不知道是否需要创建某种画布,或者只是不可能通过这种方式在同一JPG中放置3张或更多图像。

1 个答案:

答案 0 :(得分:1)

JPG文件格式不会让你逃脱。我的建议是创建一个新的BufferedImage,其中包含足够大的画布以包含所有三个图像,在交错的Y轴偏移处将三个图像渲染到其上,然后使用ImageIO将其转储到JPG。