Java 如何在编码为PNG之前调整JFreeChart的大小
我正在尝试生成一个图表,并使用下面的代码通过rest响应进行渲染 应用程序类 图表的尺寸为500x500,渲染效果非常好,但我有一个约束条件,将图像渲染为352 x 90。 指定这些维度时,图表将被截断。 我已经用下面的代码生成了一个折线图 控制器类Java 如何在编码为PNG之前调整JFreeChart的大小,java,image,png,jfreechart,image-resizing,Java,Image,Png,Jfreechart,Image Resizing,我正在尝试生成一个图表,并使用下面的代码通过rest响应进行渲染 应用程序类 图表的尺寸为500x500,渲染效果非常好,但我有一个约束条件,将图像渲染为352 x 90。 指定这些维度时,图表将被截断。 我已经用下面的代码生成了一个折线图 控制器类 @RestController 公共类LineChartController{ @RequestMapping(value=“chartsPNG”,method=RequestMethod.GET,products=MediaType.IMAG
@RestController
公共类LineChartController{
@RequestMapping(value=“chartsPNG”,method=RequestMethod.GET,products=MediaType.IMAGE\u PNG\u value)
公共响应性getPNGChart(@RequestHeader-HttpHeaders)
抛出异常{
List acceptLanguageList=标题
.get(HttpHeaders.ACCEPT_语言);
字符串acceptLanguage=acceptLanguageList.get(0);
if(接受语言。等效信号情况(“en-us”)){
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
writeBufferedImageAsPNG(baos,createLineChart().createBufferedImage(380,90));
返回新的ResponseEntity(baos.toByteArray(),HttpStatus.OK);
}
返回新的ResponseEntity(“不支持的语言”.getBytes(),
我是一个茶壶);
}
私有JFreeChart createLineChart(){
DefaultCategoryDataset lineDataSet=新的DefaultCategoryDataset();
lineDataSet.setValue(122,“每周”、“3周前”);
lineDataSet.setValue(200,“每周”、“2周前”);
lineDataSet.setValue(246,“每周”、“1周前”);
lineDataSet.setValue(348,“每周”、“本周”);
JFreeChart lineChart=ChartFactory.createLineChart(null,null,null,lineDataSet);
修改图(折线图);
返回线图;
}
受保护的无效修改图表(JFreeChart图表){
//情节操纵
CategoryPlot categoryPlotModifier=chart.getCategoryPlot();
categoryPlotModifier.getRangeAxis().setTickLabelsVisible(false);
categoryPlotModifier.setOutlineVisible(false);
categoryPlotModifier.getRangeAxis().setVisible(false);
categoryPlotModifier.getDomainAxis().SetTickMarkInsidelLength(10);
categoryPlotModifier.getDomainAxis().setCategoryLabelPositionOffset(6);
categoryPlotModifier.getDomainAxis().setLabelFont(
新字体(“SansSerif”,Font.PLAIN,100));
setAxisOffset(新的矩形插图());
//categoryPlotModifier.getRangeAxis().resizeRange(500.);
//更改图表上的字体
categoryPlotModifier.setBackgroundPaint(颜色:白色);
LineandShaperEnder渲染器=(LineandShaperEnder)categoryPlotModifier
.getRenderer();
renderer.setBaseShape(新多边形(),true);
renderer.setBaseFillPaint(Color.WHITE,true);
renderer.setBaseShapesVisible(true);
渲染器.setDrawOutlines(true);
renderer.setUseFillPaint(true);
//渲染器.setSeriesStroke(0,新基本行程(1),true);
CategoryItemLabelGenerator labelGenerator=新标准CategoryItemLabelGenerator(
“{2}”,新的十进制格式(“0.00”);
renderer.setBaseItemLabelGenerator(labelGenerator);
renderer.setBaseItemLabelsVisible(true,true);
//renderer.setBasePaint(Color.GREEN,true);
//为什么我们不能改变个体的颜色
//系列
renderer.setSeriesPaint(0,ChartColor.VERY_DARK_洋红,真);
//logger.info(Boolean.toString(renderer.getBaseShapesVisible());
chart.removeLegend();
}
}
控制器中的此行控制用于渲染的尺寸
ChartUtilities.writeBufferedImageAsPNG(BAS,createLineChart().CreateBufferedImage380,
90));
是否有办法调整图表的大小,使其呈现为352 x 90 PNG图像,该图像未被弄脏,但大小已正确调整?在@trashgood建议setUpperMargin()之后的解决方案。我确信有一种编程方法可以计算setUpperMargin函数所需的值,如果我实现了它,我会更新这个答案
@RestController
public class LineChartController {
@RequestMapping(value = "chartsPNG", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<byte[]> getPNGChart(@RequestHeader HttpHeaders headers)
throws Exception {
List<String> acceptLanguageList = headers
.get(HttpHeaders.ACCEPT_LANGUAGE);
String acceptLanguage = acceptLanguageList.get(0);
if (acceptLanguage.equalsIgnoreCase("en-us")) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ChartUtilities.writeBufferedImageAsPNG(baos, createLineChart().createBufferedImage(352, 90));
return new ResponseEntity<byte[]>(baos.toByteArray(), HttpStatus.OK);
}
return new ResponseEntity<byte[]>("Language Not Supported".getBytes(),
HttpStatus.I_AM_A_TEAPOT);
}
private JFreeChart createLineChart() {
DefaultCategoryDataset lineDataSet = new DefaultCategoryDataset();
lineDataSet.setValue(122, "weekly", "3 Weeks Ago");
lineDataSet.setValue(200, "weekly", "2 Weeks Ago");
lineDataSet.setValue(246, "weekly", "1 Week Ago");
lineDataSet.setValue(348, "weekly", "This Week");
JFreeChart lineChart = ChartFactory.createLineChart(null, null, null,lineDataSet);
modifyChart(lineChart);
return lineChart;
}
protected void modifyChart(JFreeChart chart) {
Color lineChartColor = new Color(40, 54, 67);
// plot manipulations
CategoryPlot categoryPlotModifier = chart.getCategoryPlot();
categoryPlotModifier.setOutlineVisible(false);
categoryPlotModifier.setBackgroundPaint(Color.WHITE);
//Axis modifications
categoryPlotModifier.getRangeAxis().setVisible(false);
categoryPlotModifier.getDomainAxis().setTickMarkInsideLength(10);
categoryPlotModifier.getDomainAxis().setLabelFont(new Font("SansSerif", Font.PLAIN, 1));
//Needed to avoid truncation of plot and squeeze of category label name during resized rendering (352X90)
categoryPlotModifier.getRangeAxis().setUpperMargin(.5);
categoryPlotModifier.getDomainAxis().setCategoryMargin(.02);
// Actual data point manipulations
LineAndShapeRenderer renderer = (LineAndShapeRenderer) categoryPlotModifier.getRenderer();
renderer.setSeriesShape(0,new Ellipse2D.Double(-3, -3, 6, 6), true);
renderer.setBaseFillPaint(lineChartColor, true);
renderer.setBaseShapesVisible(true);
renderer.setDrawOutlines(true);
renderer.setUseFillPaint(true);
CategoryItemLabelGenerator labelGenerator = new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("0.00"));
renderer.setBaseItemLabelGenerator(labelGenerator);
renderer.setBaseItemLabelsVisible(true, true);
/*renderer.setBasePaint(Color.GREEN, true);
// why doesn't setBasePaint change the color of all shapes and lines
* in data points and why can't we change the color of individual series
*/
renderer.setSeriesPaint(0, lineChartColor, true);
// logger.info(Boolean.toString(renderer.getBaseShapesVisible()));
chart.removeLegend();
}
}
@RestController
公共类LineChartController{
@RequestMapping(value=“chartsPNG”,method=RequestMethod.GET,products=MediaType.IMAGE\u PNG\u value)
公共响应性getPNGChart(@RequestHeader-HttpHeaders)
抛出异常{
List acceptLanguageList=标题
.get(HttpHeaders.ACCEPT_语言);
字符串acceptLanguage=acceptLanguageList.get(0);
if(接受语言。等效信号情况(“en-us”)){
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
writeBufferedImageAsPNG(baos,createLineChart().createBufferedImage(352,90));
返回新的ResponseEntity(baos.toByteArray(),HttpStatus.OK);
}
返回新的ResponseEntity(“不支持的语言”.getBytes(),
我是一个茶壶);
}
私有JFreeChart createLineChart(){
DefaultCategoryDataset lineDataSet=新的DefaultCategoryDataset();
lineDataSet.setValue(122,“每周”、“3周前”);
lineDataSet.setValue(200,“每周”、“2周前”);
lineDataSet.setValue(246,“每周”、“1周前”);
lineDataSet.setValue(348,“每周”、“本周”);
JFreeChart lineChart=ChartFactory.createLineChart(null,null,null,lineDataSet);
修改图(折线图);
返回线图;
}
受保护的无效修改图表(JFreeChart图表){
颜色线条图颜色=新颜色(40,54,67);
//情节操纵
CategoryPlot categoryPlotModifier=chart.getCategoryPlot();
categoryPlotModifier.setOutlineVisible(false);
categoryPlotModifier.setBackgroundPaint(颜色:白色);
//轴修改
categoryPlotModifier.getRangeAxis().setVisible(false);
categoryPlotModifier.getDomainAxis().SetTickMarkInsidelLength(10);
categoryPlotModifier.getDomainAxis().setLabelFont(新字体(“SansSerif”,Font.PLAIN,1));
//需要避免图的截断和类别标签的挤压
@RestController
public class LineChartController {
@RequestMapping(value = "chartsPNG", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<byte[]> getPNGChart(@RequestHeader HttpHeaders headers)
throws Exception {
List<String> acceptLanguageList = headers
.get(HttpHeaders.ACCEPT_LANGUAGE);
String acceptLanguage = acceptLanguageList.get(0);
if (acceptLanguage.equalsIgnoreCase("en-us")) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ChartUtilities.writeBufferedImageAsPNG(baos, createLineChart().createBufferedImage(380, 90));
return new ResponseEntity<byte[]>(baos.toByteArray(), HttpStatus.OK);
}
return new ResponseEntity<byte[]>("Language Not Supported".getBytes(),
HttpStatus.I_AM_A_TEAPOT);
}
private JFreeChart createLineChart() {
DefaultCategoryDataset lineDataSet = new DefaultCategoryDataset();
lineDataSet.setValue(122, "weekly", "3 Weeks Ago");
lineDataSet.setValue(200, "weekly", "2 Weeks Ago");
lineDataSet.setValue(246, "weekly", "1 Week Ago");
lineDataSet.setValue(348, "weekly", "This Week");
JFreeChart lineChart = ChartFactory.createLineChart(null, null, null,lineDataSet);
modifyChart(lineChart);
return lineChart;
}
protected void modifyChart(JFreeChart chart) {
// plot manipulations
CategoryPlot categoryPlotModifier = chart.getCategoryPlot();
categoryPlotModifier.getRangeAxis().setTickLabelsVisible(false);
categoryPlotModifier.setOutlineVisible(false);
categoryPlotModifier.getRangeAxis().setVisible(false);
categoryPlotModifier.getDomainAxis().setTickMarkInsideLength(10);
categoryPlotModifier.getDomainAxis().setCategoryLabelPositionOffset(6);
categoryPlotModifier.getDomainAxis().setLabelFont(
new Font("SansSerif", Font.PLAIN, 100));
categoryPlotModifier.setAxisOffset(new RectangleInsets());
// categoryPlotModifier.getRangeAxis().resizeRange(500.);
// change fonts on charts
categoryPlotModifier.setBackgroundPaint(Color.WHITE);
LineAndShapeRenderer renderer = (LineAndShapeRenderer) categoryPlotModifier
.getRenderer();
renderer.setBaseShape(new Polygon(), true);
renderer.setBaseFillPaint(Color.WHITE, true);
renderer.setBaseShapesVisible(true);
renderer.setDrawOutlines(true);
renderer.setUseFillPaint(true);
// renderer.setSeriesStroke(0, new BasicStroke(1), true);
CategoryItemLabelGenerator labelGenerator = new StandardCategoryItemLabelGenerator(
"{2}", new DecimalFormat("0.00"));
renderer.setBaseItemLabelGenerator(labelGenerator);
renderer.setBaseItemLabelsVisible(true, true);
// renderer.setBasePaint(Color.GREEN, true);
// why not baseColor and why can't we change the color of individual
// series
renderer.setSeriesPaint(0, ChartColor.VERY_DARK_MAGENTA, true);
// logger.info(Boolean.toString(renderer.getBaseShapesVisible()));
chart.removeLegend();
}
}
@RestController
public class LineChartController {
@RequestMapping(value = "chartsPNG", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<byte[]> getPNGChart(@RequestHeader HttpHeaders headers)
throws Exception {
List<String> acceptLanguageList = headers
.get(HttpHeaders.ACCEPT_LANGUAGE);
String acceptLanguage = acceptLanguageList.get(0);
if (acceptLanguage.equalsIgnoreCase("en-us")) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ChartUtilities.writeBufferedImageAsPNG(baos, createLineChart().createBufferedImage(352, 90));
return new ResponseEntity<byte[]>(baos.toByteArray(), HttpStatus.OK);
}
return new ResponseEntity<byte[]>("Language Not Supported".getBytes(),
HttpStatus.I_AM_A_TEAPOT);
}
private JFreeChart createLineChart() {
DefaultCategoryDataset lineDataSet = new DefaultCategoryDataset();
lineDataSet.setValue(122, "weekly", "3 Weeks Ago");
lineDataSet.setValue(200, "weekly", "2 Weeks Ago");
lineDataSet.setValue(246, "weekly", "1 Week Ago");
lineDataSet.setValue(348, "weekly", "This Week");
JFreeChart lineChart = ChartFactory.createLineChart(null, null, null,lineDataSet);
modifyChart(lineChart);
return lineChart;
}
protected void modifyChart(JFreeChart chart) {
Color lineChartColor = new Color(40, 54, 67);
// plot manipulations
CategoryPlot categoryPlotModifier = chart.getCategoryPlot();
categoryPlotModifier.setOutlineVisible(false);
categoryPlotModifier.setBackgroundPaint(Color.WHITE);
//Axis modifications
categoryPlotModifier.getRangeAxis().setVisible(false);
categoryPlotModifier.getDomainAxis().setTickMarkInsideLength(10);
categoryPlotModifier.getDomainAxis().setLabelFont(new Font("SansSerif", Font.PLAIN, 1));
//Needed to avoid truncation of plot and squeeze of category label name during resized rendering (352X90)
categoryPlotModifier.getRangeAxis().setUpperMargin(.5);
categoryPlotModifier.getDomainAxis().setCategoryMargin(.02);
// Actual data point manipulations
LineAndShapeRenderer renderer = (LineAndShapeRenderer) categoryPlotModifier.getRenderer();
renderer.setSeriesShape(0,new Ellipse2D.Double(-3, -3, 6, 6), true);
renderer.setBaseFillPaint(lineChartColor, true);
renderer.setBaseShapesVisible(true);
renderer.setDrawOutlines(true);
renderer.setUseFillPaint(true);
CategoryItemLabelGenerator labelGenerator = new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("0.00"));
renderer.setBaseItemLabelGenerator(labelGenerator);
renderer.setBaseItemLabelsVisible(true, true);
/*renderer.setBasePaint(Color.GREEN, true);
// why doesn't setBasePaint change the color of all shapes and lines
* in data points and why can't we change the color of individual series
*/
renderer.setSeriesPaint(0, lineChartColor, true);
// logger.info(Boolean.toString(renderer.getBaseShapesVisible()));
chart.removeLegend();
}
}