Java 背景图片拼接 根据内容生成的二维码
Java 图片拼接根据内容生成的二维码 直接上代码:此类可作为工具类 自己琢磨自学 不喜请喷。
此为Java web项目 在pom.xml文件添加:(谷歌官方API 可以百度搜索 下载Jar 包)
<!-- 图片组合二维码 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.1.0</version>
</dependency>
public class ImageAndQRcode {
private staticfinal int BLACK = 0xFF000000;
private staticfinal int WHITE = 0xFFFFFFFF;
ImageAndQRcode() {
}
private static BufferedImage toBufferedImage(BitMatrixmatrix) {
int width =matrix.getWidth();
int height =matrix.getHeight();
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
for (intx = 0; x < width; x++) {
for (inty = 0; y < height; y++) {
image.setRGB(x,y, matrix.get(x,y) ? BLACK :WHITE);
}
}
return image;
}
private staticvoid writeToFile(BitMatrix matrix, String format, File file)
throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image,format, file)) {
thrownew IOException("Could not write an image of format "
+ format + " to " + file);
}
}
/**
* @Title: 构造图片
* @Description: 生成水印并返回java.awt.image.BufferedImage
* @param file源文件(图片)
* @param waterFile水印文件(图片)
* @param x距离右下角的X偏移量
* @param y 距离右下角的Y偏移量
* @param alpha 透明度, 选择值从0.0~1.0: 完全透明~完全不透明
* @return BufferedImage
* @throws IOException
*/
private static BufferedImage watermark(Filefile, File waterFile,int x, int y, floatalpha) throws IOException {
// 获取底图
BufferedImage buffImg = ImageIO.read(file);
// 获取层图
BufferedImage waterImg = ImageIO.read(waterFile);
// 创建Graphics2D对象,用在底图对象上绘图
Graphics2D g2d = buffImg.createGraphics();
int waterImgWidth =waterImg.getWidth();// 获取层图的宽度
int waterImgHeight =waterImg.getHeight();// 获取层图的高度
// 在图形和图像中实现混合和透明效果
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));
// 绘制
g2d.drawImage(waterImg,x, y, waterImgWidth, waterImgHeight,null);
g2d.dispose();// 释放图形上下文使用的系统资源
return buffImg;
}
/**
* 输出水印图片
*
* @param buffImg 图像加水印之后的BufferedImage对象
* @param savePath 图像加水印之后的保存路径
*/
private void generateWaterFile(BufferedImagebuffImg, String savePath) {
int temp =savePath.lastIndexOf(".") + 1;
try {
ImageIO.write(buffImg, savePath.substring(temp), new File(savePath));
} catch (IOException e1) {
e1.printStackTrace();
}
}
/**
*
* @param text 二维码内容
* @param width 二维码图片宽度
* @param height 二维码图片高度
* @param format 二维码的图片格式
* @param sourceFilePath 底层图片路径
* @param waterFilePath 二维码路径
* @param saveFilePath 合成图片路径
* @param maginx 二维码距离底图x轴距离
* @param maginy 二维码距离底图y轴距离
* @throws Exception
*/
public void addImageQRcode(Stringtext,int width,int height,Stringformat,
String sourceFilePath,String waterFilePath, StringsaveFilePath,intmaginx,intmaginy)throws Exception{
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET,"utf-8"); // 内容所使用字符集编码
BitMatrix bitMatrix =new MultiFormatWriter().encode(text,
BarcodeFormat.QR_CODE,width, height,hints);
// 生成二维码
File outputFile = new File("/Users/chenfenqian/Desktop" + File.separator +"new.jpg");
ImageAndQRcode.writeToFile(bitMatrix,format, outputFile);
ImageAndQRcode newImageUtils = new ImageAndQRcode();
// 构建叠加层
BufferedImage buffImg = ImageAndQRcode.watermark(new File(sourceFilePath),new File(waterFilePath),maginx, maginy, 1.0f);
// 输出水印图片
newImageUtils.generateWaterFile(buffImg,saveFilePath);
}
测试代码如下 图片随机找的 说明问题就可以了;
public staticvoid main(String[] args) throws IOException {
ImageAndQRcode add = new ImageAndQRcode();
try {
add.addImageQRcode("http://www.baidu.com", 300, 300,"jpg", "/Users/chenfenqian/Documents/图片素材/welcome0.png",
"/Users/chenfenqian/Desktop/new.jpg","/Users/chenfenqian/Desktop/new1.png",780,1620);
} catch (Exceptione) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}