Graphics2渲染图像导出的3种方式
来源:互联网 发布:mysql中的日期函数 编辑:程序博客网 时间:2024/06/14 03:10
写出来主要是希望遇到大神指点迷津,这自己边试边学得出来得经验来得太慢了,而且累。有没有更实用的资料或者书籍介绍java画图中,JFrame,JPanel,JComponent,Graphics,Graphices2D,Graphices3D,Shape,这些区别与联系的实用的资料书,本人将不胜感激!!!
其实主要是想用JComponent这个组件,里面有些画图方法比较方便。但是返回的对象又不知道怎么做处理导出,所以就尝试,实验出了这3种导出方法。
1.通过导出jfream窗口图片(这种方式是jfream窗口和图片保存都会做显示,jfream的黑框背景会显示,求大神指点)
package com.dasenlin.test;import java.awt.Container;import java.awt.EventQueue;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;import com.dasenlin.util.MyFrame;public class TestJframePic { public static final String DEST4 = "C:/Users/Toshiba/Desktop/testjframe.png"; /** * @param args */ public static void main(String[] args) { /* * 在 AWT 的事件队列线程中创建窗口和组件, 确保线程安全, * 即 组件创建、绘制、事件响应 需要处于同一线程。 */ EventQueue.invokeLater(new Runnable() { @Override public void run() { // 创建窗口对象 MyFrame frame = new MyFrame("折线",250,300); // 显示窗口(必须显示,否则就是黑框,还有就是这个有点问题的就是,jfream的黑框背景会显示,求大神指点) frame.setVisible(true); savePic(frame); } }); } public static void savePic(JFrame jf){ //得到窗口内容面板 Container content=jf.getContentPane(); //创建缓冲图片对象 BufferedImage img=new BufferedImage( jf.getWidth(),jf.getHeight(),BufferedImage.TYPE_INT_RGB); //得到图形对象 Graphics2D g2d = img.createGraphics(); //将窗口内容面板输出到图形对象中 content.printAll(g2d); //保存为图片 try{ ImageIO.write(img, "jpg", new File( DEST4)); }catch (IOException e){ e.printStackTrace(); } //释放图形对象 g2d.dispose(); } }
2.通过导出Jpanel图片(这种方式可以不用考虑jfream的黑框背景,甚至不显示jfream也能导出)
package com.dasenlin.util;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.WindowConstants;/** * * @author Toshiba * */public class MyFrame extends JFrame { /** * */ private static final long serialVersionUID = 1L; public static final String DEST4 = "C:/Users/Toshiba/Desktop/testjframe.png"; public MyFrame(String title,Integer windowW,Integer windowH) { super(); initFrame(title,windowW,windowH); } private void initFrame(String title,Integer windowW,Integer windowH) { // 设置 窗口标题 和 窗口大小 setTitle(title); setSize(windowW, windowH); // 设置窗口关闭按钮的默认操作(点击关闭时退出进程) setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 把窗口位置设置到屏幕的中心 setLocationRelativeTo(null); // 设置窗口的内容面板 MyPanel panel = new MyPanel(this); setContentPane(panel); //自己的JPanel // 必须要有大小 panel.setSize(windowW, windowH); BufferedImage image = new BufferedImage(windowW, windowH, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = image.createGraphics(); panel.paint(g2); try { ImageIO.write(image, "jpg", new File(DEST4)); } catch (IOException e) { e.printStackTrace(); } }}
直接graphics2D中用graphics的画图方法导出
public static void savePic(JFrame jf){ BufferedImage images= DepParserSvgUtil.depParserSvg(dataList); try{ ImageIO.write(images, "PNG", new File( DEST4)); }catch (IOException e){ e.printStackTrace(); } } public static BufferedImage depParserSvg(List<Map<String,Object>> yicunList){BufferedImage bi = new BufferedImage(DEFAULT_W, DEFAULT_H, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bi.createGraphics(); //设置画笔(设置背景) g2d.setPaint(Color.WHITE); g2d.fillRect(5, 5, DEFAULT_W, DEFAULT_H); //draw string g2d.setPaint(Color.BLACK); Font f = new Font("宋体", Font.PLAIN, ZH_WORD_WIDTH); g2d.setFont(f); FontRenderContext context = g2d.getFontRenderContext(); for(int w=0; w<yicunList.size();w++){ String word = yicunList.get(w).get("word").toString(); String mark = yicunList.get(w).get("id").toString()+"|"+yicunList.get(w).get("post").toString(); String lable = yicunList.get(w).get("dep_type").toString(); float wordx = (float) WORDS_TRANSLATE.get(w).get("x"); float wordy = (float) WORDS_TRANSLATE.get(w).get("y"); g2d.drawString(word, wordx, wordy); Rectangle2D bounds = f.getStringBounds(word, context); g2d.draw(bounds); double wordW=bounds.getWidth();//文本宽度 double wordH=bounds.getHeight();//文本高度 double ascent=-bounds.getY();//文本上坡度 LineMetrics metrics=f.getLineMetrics(word, context); float descent=metrics.getDescent();//文本下坡度 float leading=metrics.getLeading();//文本行距 float markx = wordx; float marky = (float) (wordy+descent+leading+wordH); g2d.drawString(mark, markx, marky); bounds = f.getStringBounds(mark, context); g2d.draw(bounds); double markW=bounds.getWidth();//文本宽度 //画边框矩形 double borderW = (double) Math.max(wordW, markW); Rectangle2D msgRect=new Rectangle2D.Double(wordx,wordy-ascent,borderW,wordH*2+descent*2+leading*2);//包围文本的矩形 g2d.draw(msgRect); //画关系线 int edge1x = EDGE_PATH.get(w).get(0).get("x"); int edge1y = EDGE_PATH.get(w).get(0).get("y"); int edge2x = EDGE_PATH.get(w).get(1).get("x"); int edge2y = EDGE_PATH.get(w).get(1).get("y"); int edge3x = EDGE_PATH.get(w).get(2).get("x"); int edge3y = EDGE_PATH.get(w).get(2).get("y"); int edge4x = EDGE_PATH.get(w).get(3).get("x"); int edge4y = EDGE_PATH.get(w).get(3).get("y"); g2d.drawLine(edge1x, edge1y, edge2x, edge2y); g2d.drawLine(edge2x, edge2y, edge3x, edge3y); g2d.drawLine(edge3x, edge3y, edge4x, edge4y); //画箭头 int rectangle1x =edge4x-5; int rectangle1y =edge4y; int rectangle2x =edge4x+5; int rectangle2y =edge4y; int rectangle3x =edge4x; int rectangle3y =edge4y+5; g2d.drawLine(rectangle1x, rectangle1y, rectangle2x, rectangle2y); g2d.drawLine(rectangle2x, rectangle2y, rectangle3x, rectangle3y); g2d.drawLine(rectangle3x, rectangle3y, rectangle1x, rectangle1y); //画lable int lablex = EDGE_LABLE_INFO.get(w).get("x"); int labley = EDGE_LABLE_INFO.get(w).get("y"); int lableH = EDGE_LABLE_INFO.get(w).get("height"); int lableW = EDGE_LABLE_INFO.get(w).get("width"); f = new Font("SansSerif",Font.BOLD,ONE_LABLE_HEIGHT); context = g2d.getFontRenderContext(); bounds = f.getStringBounds(lable,context); g2d.setFont(f); g2d.clearRect((int)(lablex*1.05 - bounds.getCenterX()), (int)(labley - (lableH/2) - bounds.getCenterY()), lableW, lableH); g2d.drawString(lable, (float) (lablex*1.05 - bounds.getCenterX()), (float) (labley - (lableH/2) - bounds.getCenterY())); } /****************Graphics2DDrawEnd*****************/ g2d.dispose();//销毁资源 return bi;}
综合上述,实用继承Jpanel并输出图片的方式比较好,可以兼顾jfream的前端输出,可以做后台输出。还可以实用组件的一些好用方法。代码结构比较清晰。
以下是Jpanel中画图的代码
package com.dasenlin.util;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Paint;import java.awt.RenderingHints;import java.awt.Toolkit;import javax.swing.JPanel;public class MyPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; private MyFrame frame; public MyPanel(MyFrame frame) { this.frame = frame; } /** * 绘制面板的内容: 创建 JPanel 后会调用一次该方法绘制内容, * 之后如果数据改变需要重新绘制, 可调用 updateUI() 方法触发 * 系统再次调用该方法绘制更新 JPanel 的内容。 */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 重新调用 Graphics 的绘制方法绘制时将自动擦除旧的内容 /* 自行打开下面注释查看各绘制效果 */ // 1. 线段 / 折线 drawLine(g); // 2. 矩形 / 多边形 // drawRect(g); // 3. 圆弧 / 扇形 // drawArc(g); // 4. 椭圆 // drawOval(g); // 5. 图片 // drawImage(g); // 6. 文本 // drawString(g); } /** * 1. 线段 / 折线 */ private void drawLine(Graphics g) { frame.setTitle("1. 线段 / 折线"); // 创建 Graphics 的副本, 需要改变 Graphics 的参数, // 这里必须使用副本, 避免影响到 Graphics 原有的设置 Graphics2D g2d = (Graphics2D) g.create(); // 抗锯齿 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 设置画笔颜色 g2d.setColor(Color.RED); }
写出来主要是希望遇到大神指点迷津,这自己边试边学得出来得经验来得太慢了,而且累。有没有更实用的资料或者书籍介绍java画图中,JFrame,JPanel,JComponent,Graphics,Graphices2d,Graphices3D,Shape,这些区别与联系的资料书,本人将不胜感激!!!
阅读全文
0 0
- Graphics2渲染图像导出的3种方式
- 导出DLL函数的3种方式
- Q109:用PBRT渲染Blender导出的模型(3)
- 渲染图像
- UI组件渲染的方式
- opengl 渲染四边形的方式
- 图片渲染的实现方式
- UINavigationBar的系统渲染方式
- android图片的渲染方式
- thinkPHP5-渲染模板的方式
- Yii 渲染与布局(渲染页面的两种方式)
- Yii 渲染与布局(渲染页面的两种方式)
- CGContextDrawPath CGContextFillPath渲染的几种方式比较分析讲解
- 设置UIImage的渲染模式:UIImage.renderingMode(两种方式)
- 刷新组件RENDER(重新渲染)的三种方式详解
- 魔兽争霸3的自动拼接地形渲染方式
- 魔兽争霸3的自动拼接地形渲染方式
- 3D渲染引擎着色方式的演化史
- Spring MVC学习指南(11-12章总结)
- C++创建链表
- dfs实现单源点最短路径求解
- Java后台与js前端之间的通信问题
- 选择音视频SDK解决方案的标准技术
- Graphics2渲染图像导出的3种方式
- 机器学习实战(Machine Learning in Action)参考答案以及原始数据
- 【每周论文】Xen and the Art of Virtualization
- linux 链接器 库打桩
- python爬虫备忘(6)
- jquery遍历集合$each()使用方法
- Some Example For C++
- IDEA下载激活配置
- 虚拟地址、线性地址和物理地址的转换