吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2534|回复: 0
收起左侧

[Java 转载] 用Graphics2D进行图片合成操作

[复制链接]
三木猿 发表于 2021-12-26 18:39
最近的一个小项目需要用到图片合成,所以研究了一下Graphics2D。要使用Graphics2D进行图片操作,首先需要知道这么个玩意
BufferedImage
管他是啥,反正就是用来存你的图片数据,比如长宽高,编码啥的,详细百度去
我用的时候是前端上传图片,所以接收的类是MultipartFile
也就是转换成BufferedImage
[Java] 纯文本查看 复制代码
 BufferedImage read =ImageIO.read(imgFile.getInputStream());

这里引出来了另一个东西
ImageIO
这个是啥?(百度去)我们这就用其中的两个方法
         ImageIO.read
                这个方法是用来读取InputStream然后转化为BufferedImage
                我用的是MultipartFile的getInputStream获取InputStream,你也可以用其他方法获取InputStream,比如new FileInputStream(path)方法
         ImageIO.write
                 跟read相对,这个是用来输出的,所以入参就是BufferedImage,图片类型,OutputStream(输出流)
[Java] 纯文本查看 复制代码
    ImageIO.write(image, "png", new File(path));

Graphics2D
然后就是重头戏了Graphics2D,图片操作
其中的方法很多,就不一一介绍了,想知道的可以去下载一个jkd8的api中文文档,里面有这些,我主要说一下我用到的
[Java] 纯文本查看 复制代码
/**
     * [url=home.php?mod=space&uid=952169]@Param[/url] buffImg  源文件(图片)
     * @param waterImg 水印文件(图片)二维码图片
     * @param x        距离右下角的X偏移量
     * @param y        距离右下角的Y偏移量
     * @param alpha    透明度, 选择值从0.0~1.0: 完全透明~完全不透明
     * [url=home.php?mod=space&uid=155549]@Return[/url] BufferedImage
     * @throws IOException
     * @Title: 构造图片
     * @Description: 生成水印并返回java.awt.image.BufferedImage
     */
    public static BufferedImage watermark(BufferedImage buffImg, BufferedImage waterImg, int x, int y, float alpha) 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;
    }


setComposite想实现图片透明可以用这个,alpha就是透明度,取值范围0-1
drawImage
这个是重点,第一个参数类型是BufferedImage,也就是用来传入水印图片(你要加到图片上的图片。。)
第二,第三个参数对应的是x和y,也就是合成的图片左上角的坐标,单位是像素,数据类型整数(别管那零点几了!)
第四第五个参数是宽和高,对应的是水印图片的宽和高
image.png
最后就是dispose,释放图形上下文使用的系统资源,就结束语呗,必须有,不然之后系统崩了,别说我没提醒
然后就没了,就这么简单。
附加一个增加文字水印的代码
[Java] 纯文本查看 复制代码
/**
     * @param waterMarkContent 水印内容
     * @param markContentColor 水印颜色
     * @param font             水印字体
     */
    public static Object addWaterMark(BufferedImage buffImg, int x, int y, String waterMarkContent, Color markContentColor, Font font) {
        Graphics2D g2d = buffImg.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setColor(markContentColor);
        g2d.setFont(font);
        // 打印字符串,例如:g2d.drawString(text, x, y);
        g2d.drawString(waterMarkContent, x, y);
        g2d.dispose();
        return null;
    }












免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表