【问题标题】:Exporting more than one image in one JPG file在一个 JPG 文件中导出多个图像
【发布时间】:2012-08-03 14:09:11
【问题描述】:

我有一个允许用户导出一些数据的 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 数组中的第一个)

我不知道我是否必须创建某种画布,或者无法通过这种方式将 3 张或更多图像放在同一个 JPG 中。

【问题讨论】:

  • 如果您正在谈论将多个图像放入一个文件内的单独隔间中,那么 JPEG 不支持这一点。您将需要使用 TIFF。

标签: java jsp bytearray jfreechart


【解决方案1】:

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

【讨论】:

  • 但是我怎么能附加这个 ImageIO 呢?因为这样我必须使用类似的东西: ImageIO.write(myImage, "jpg", new File("some path"));但我不想将图像保存在任何路径中,我想在浏览器上下载图像
  • 您可以使用带有OutputStream 的写入方法,并将您的servlet 响应中的流传递给它:docs.oracle.com/javase/1.4.2/docs/api/javax/imageio/…
猜你喜欢
  • 1970-01-01
  • 2012-05-18
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2011-03-08
  • 1970-01-01
相关资源
最近更新 更多