java图片处理-生成图片&画板使用&多张图片合成&表格绘制

生成图片 合成图片

应用场景: 背景图片加入二维码和文字

转自凉城大神

package com.test;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;


public class ImageService {

    public String background_img;

    public String qrcode_img;

    public String gzh_img;
    
    public String outputdir;
    
    
    public File createImage(String name) {
        return overlapImage(background_img, gzh_img,qrcode_img, name, outputdir);
    }
    
    public File overlapImage(String backgroundPath, String gzhPath, String qrCodePath, String text, String outPutPath) {
        try {
            // 设置图片大小
             //设置图片大小
            BufferedImage background = resizeImage(848,1018, ImageIO.read(new File(backgroundPath)));
            BufferedImage qrCode = resizeImage(80,80,ImageIO.read(new File(qrCodePath)));
            BufferedImage gzh = resizeImage(80,80,ImageIO.read(new File(gzhPath)));
            Graphics2D g = background.createGraphics();
            g.setColor(Color.black);
            g.setFont(new Font("微软雅黑",Font.PLAIN,40));
            g.drawString(text,436 ,630);
            //在背景图片上添加二维码图片
            g.drawImage(qrCode, 760, 920, qrCode.getWidth(), qrCode.getHeight(), null);
            g.drawImage(gzh, 660, 920, gzh.getWidth(), gzh.getHeight(), null);
            g.dispose();
            File out = new File(outPutPath + System.currentTimeMillis()+".jpg");
            ImageIO.write(background, "jpg", out);
            return out;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static BufferedImage resizeImage(int x, int y, BufferedImage bfi) {
        BufferedImage bufferedImage = new BufferedImage(x, y, BufferedImage.TYPE_INT_RGB);
        bufferedImage.getGraphics().drawImage(bfi.getScaledInstance(x, y, Image.SCALE_SMOOTH), 0, 0, null);
        return bufferedImage;
    }

}

画板使用

应用场景: 生成纯色图片 和 画板的使用 以及 绘制表格

转自: 小林子林子大佬

public class Demo01 {
 
	public static void main(String[] args) throws FileNotFoundException, IOException {
 
		int width = 820; // 图片宽
		int height = 600;// 图片高
		String titleStr = "公司测试点";
		String zhangdanzhouqiStr = "2019年2月1日至2019年2月28日"; // 账单周期
		String zhangdantianshuStr = "85天"; // 账单天数
		String bengedinggonglvStr = "1000KW";// 泵额定功率
		String bengbianpingjienengyunxingyongdianliangStr = "100度"; // 泵变频节能运行用电量
		String dianjiaStr = "100元/度"; // 电价
		String pingjunjienenglvStr = "50%";// 平均节能率
		String daizhifujingeStr = "1000元"; // 待支付金额
		String bengyunxingzongshichangStr = "200小时"; // 泵运行总时长
		String benggongping运行yongdianliangStr = "99度"; // 泵工频运行用电量
		String jieshengdianliangStr = "100度"; // 节省电量
		String jieshengjineStr = "1000元"; // 节省金额
 
		// 得到图片缓冲区
		BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// INT精确度达到一定,RGB三原色,高度70,宽度150
 
		// 得到它的绘制环境(这张图片的笔)
		Graphics2D g2 = (Graphics2D) bi.getGraphics();
		g2.setColor(Color.WHITE); // 设置背景颜色
		g2.fillRect(0, 0, width, height);// 填充整张图片(其实就是设置背景颜色)
		g2.setColor(Color.black);// 设置字体颜色
		g2.setStroke(new BasicStroke(2.0f)); // 边框加粗
		g2.drawRect(1, 1, width - 2, height - 2); // 画边框就是黑边框
 
		g2.drawLine(0, 80, 820, 80); // 从上到下第二个横线(标题下面横线)
		g2.setStroke(new BasicStroke(0.0f)); // 边框不需要加粗
		g2.drawLine(0, 154, 820, 154); // 从上到下第三个横线(账单周期下面横线)
		g2.drawLine(0, 228, 820, 228); // 从上到下第四个横线(账单天数下面横线)
		g2.drawLine(0, 302, 820, 302); // 从上到下第5个横线(泵额定功率下面横线)
		g2.drawLine(0, 376, 820, 376); // 从上到下第6个横线(泵变频节能运行用电量下面横线)
		g2.drawLine(0, 451, 820, 451); // 从上到下第7个横线(电价下面横线)
		g2.drawLine(0, 525, 820, 525); // 从上到下第8个横线(平均节能率下面横线)
 
		g2.drawLine(180, 80, 180, 600); // 从左到右第二个竖线
		g2.drawLine(390, 154, 390, 451); // 从左到右第三个竖线
		g2.drawLine(574, 154, 574, 451); // 从左到右第四个竖线
 
		// 设置标题的字体,字号,大小
		Font titleFont = new Font("宋体", Font.BOLD, 30);
		g2.setFont(titleFont);
		String markNameStr = titleStr;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 抗锯齿
		// 计算文字长度,计算居中的X点坐标
		FontMetrics fm = g2.getFontMetrics(titleFont);
		int titleWidth = fm.stringWidth(markNameStr);
		int titleWidthX = (width - titleWidth) / 2 - 35;// 感觉不居中,向左移动35个单位
		g2.drawString(markNameStr + "节能账单", titleWidthX, 45);
 
		// 账单周期
		g2.setFont(new Font("宋体", Font.BOLD, 20));
		g2.drawString("账单周期", 33, 125);
		// 账单周期的值
		g2.drawString(zhangdanzhouqiStr, 230, 125);
 
		// 账单天数
		g2.drawString("账单天数", 33, 200);
		// 账单天数的值
		g2.drawString(zhangdantianshuStr, 230, 200);
 
		// 泵额定功率
		g2.drawString("泵额定功率", 33, 274);
		// 泵额定功率
		g2.drawString(bengedinggonglvStr, 230, 274);
 
		// 泵变频节能运行用电量
		g2.drawString("泵变频节能运", 33, 338);
		g2.drawString("行用电量", 33, 360);
		// // 泵变频节能运行用电量的值
		g2.drawString(bengbianpingjienengyunxingyongdianliangStr, 230, 345);
 
		// 电价
		g2.drawString("电价", 33, 423);
		// 电价的值
		g2.drawString(dianjiaStr, 230, 423);
 
		// 平均节能率
		g2.drawString("平均节能率", 33, 496);
		// 平均节能率
		g2.drawString(pingjunjienenglvStr, 230, 496);
 
		// 待支付金额
		g2.drawString("待支付金额", 33, 568);
		// 待支付金额的值
		g2.drawString(daizhifujingeStr, 230, 568);
 
		// 泵运行总时长
		g2.drawString("泵运行总时长", 420, 200);
		// 泵运行总时长的值
		g2.drawString(bengyunxingzongshichangStr, 630, 200);
 
		// 泵工频运行用电量
		g2.drawString("泵工频运行用", 420, 265);
		g2.drawString("电量", 420, 287);
		// 泵工频运行用电量的值
		g2.drawString(benggongping运行yongdianliangStr, 630, 274);
 
		// 节省电量
		g2.drawString("节省电量", 420, 348);
		// 节省电量的值
		g2.drawString(jieshengdianliangStr, 630, 345);
 
		// 节省金额
		g2.drawString("节省金额", 420, 423);
		// 节省金额的值
		g2.drawString(jieshengjineStr, 630, 423);
 
		g2.dispose(); // 释放对象
		ImageIO.write(bi, "JPEG", new FileOutputStream("D:/a.jpg"));// 保存图片 JPEG表示保存格式
	}

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Canvas画板插入多张图片,可以使用以下步骤: 1. 创建多个Image对象,使用JavaScript代码创建多个Image对象,可以通过new Image()来创建。 2. 加载图片使用Image对象的src属性来设置图片的路径,然后监听load事件来确保图片已经加载完成。 3. 在Canvas上绘制图片使用Canvas上下文对象的drawImage()方法来在Canvas上绘制图片,可以指定图片的位置和大小。 以下是代码示例: ```html <canvas id="canvas" width="500" height="500"></canvas> <script> var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var img1 = new Image(); img1.src = 'image1.jpg'; var img2 = new Image(); img2.src = 'image2.jpg'; var img3 = new Image(); img3.src = 'image3.jpg'; var loadedImages = 0; var totalImages = 3; img1.onload = function() { loadedImages++; if (loadedImages === totalImages) { draw(); } } img2.onload = function() { loadedImages++; if (loadedImages === totalImages) { draw(); } } img3.onload = function() { loadedImages++; if (loadedImages === totalImages) { draw(); } } function draw() { ctx.drawImage(img1, 0, 0, canvas.width, canvas.height); ctx.drawImage(img2, 100, 100, 200, 200); ctx.drawImage(img3, 300, 300, 100, 100); } </script> ``` 在上面的示例,我们首先创建了一个Canvas元素和一个Canvas上下文对象,然后创建了多个Image对象并设置了图片路径,接着监听每个图片的load事件,每次图片加载完成后,将loadedImages加1,当所有图片都加载完成后,调用draw()函数,在函数使用drawImage()方法在Canvas上绘制多张图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值