JAVA (Graphics2D)解决合成图片失真问题

article/2025/9/18 12:06:45

附对比图:

合成后失真严重

代码优化后:

原代码:

参数解释:

1. img为你需要把他合成到A图片上的B图片,以下简称为章

2. srcImagePath为A图片的绝对路径

3. targetPath为合成后的图片输出路径

4. x,y为章需要合成到A图片上的位置坐标,w,h为将章缩小到多少长宽比例

注意这行代码:g.drawImage(img, x, y, w, h, null);

public static void markByIcon(Image img, String srcImagePath, String targetPath, int x, int y,int w, int h) throws IOException {OutputStream os = null;try {logger.info("图片水印开始添加。。。");logger.info("图片水印输入路径" + srcImagePath);logger.info("图片水印输出路径" + targetPath);Image srcImage = ImageIO.read(new File(srcImagePath));BufferedImage buffImg = new BufferedImage(srcImage.getWidth(null), srcImage.getHeight(null),BufferedImage.TYPE_INT_BGR);Graphics2D g = buffImg.createGraphics();g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.drawImage(srcImage.getScaledInstance(srcImage.getWidth(null), srcImage.getHeight(null), Image.SCALE_SMOOTH),0, 0, null);g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1));g.drawImage(img, x, y, w, h, null);g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));g.dispose();os = new FileOutputStream(targetPath);//生成图片ImageIO.write(buffImg, "JPG", os);logger.info("图片水印添加成功。。。");} catch (Exception e) {logger.error("图片水印添加失败。。。", e);throw e;} finally {try {if (null != os) {os.close();}} catch (Exception e) {e.printStackTrace();}}}

优化后代码:

原代码是将章在合成的时候按比例缩小,在缩小过程中失真了,优化后为先将章缩小到想要的比例,然后用缩小后的章进行合成

压缩代码:

/*** * 将图片按照指定的图片尺寸压缩 * * @param srcImgPath :源图片路径 * @param outImgPath * :输出的压缩图片的路径 * @param new_w* * :压缩后的图片宽 * @param new_h * :压缩后的图片高*/public static BufferedImage compressImage(String srcImgPath, int new_w, int new_h) {BufferedImage src = inputImage(srcImgPath);BufferedImage bufferedImage = disposeImage(src, new_w, new_h);return bufferedImage;}/*** 处理图片 * * @param src * @param outImgPath * @param new_w * @param new_h*/private synchronized static BufferedImage disposeImage(BufferedImage src, int new_w, int new_h) {// 得到图片int old_w = src.getWidth();// 得到源图宽int old_h = src.getHeight();// 得到源图长BufferedImage newImg = null;// 判断输入图片的类型switch (src.getType()) {case 13:// png,gifnewImg = new BufferedImage(new_w, new_h,// BufferedImage.TYPE_4BYTE_ABGR);break;default:newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);break;}Graphics2D g = newImg.createGraphics();// 从原图上取颜色绘制新图g.drawImage(src, 0, 0, old_w, old_h, null);g.dispose();// 根据图片尺寸压缩比得到新图的尺寸newImg.getGraphics().drawImage(src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0,null);// 调用方法输出图片文件return newImg;}/*** * 将图片文件输出到指定的路径,并可设定压缩质量 * * @param outImgPath * @param newImg * @param per*/private static void OutImage(String outImgPath, BufferedImage newImg) {// 判断输出的文件夹路径是否存在,不存在则创建File file = new File(outImgPath);if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}// 输出到文件流try {ImageIO.write(newImg, outImgPath.substring(outImgPath.lastIndexOf(".") + 1), new File(outImgPath));} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

优化后代码:

先通过compressImage方法将章图片进行比例缩小,然后用缩小后的bufferedImage去进行合成

BufferedImage bufferedImage = ImageUtil.compressImage(signPath, photoConfig.getWidth(), photoConfig.getHeight());
Image signImg = ImageUtil.sign(bufferedImage);
if (signImg == null) {throw new MyException("图片生成失败,签名异常");
}
ImageUtil.markBySignIcon(signImg, imagePath, targetPath, x, y, photoConfig.getWidth(), photoConfig.getHeight());

此时我将原markByIcon方法进行了修改,修改后代码如下,修改后的方法名为markBySignIcon如上最后一行

public static void markBySignIcon(Image img, String srcImagePath, String targetPath, int x, int y,int w, int h) throws IOException {OutputStream os = null;try {logger.info("图片水印开始添加。。。");logger.info("图片水印输入路径" + srcImagePath);logger.info("图片水印输出路径" + targetPath);Image srcImage = ImageIO.read(new File(srcImagePath));BufferedImage buffImg = new BufferedImage(srcImage.getWidth(null), srcImage.getHeight(null),BufferedImage.TYPE_INT_BGR);Graphics2D g = buffImg.createGraphics();g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.drawImage(srcImage.getScaledInstance(srcImage.getWidth(null), srcImage.getHeight(null), Image.SCALE_SMOOTH),0, 0, null);g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1));g.drawImage(img, x, y, img.getWidth(null), img.getHeight(null), null);g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));g.dispose();os = new FileOutputStream(targetPath);//生成图片ImageIO.write(buffImg, "JPG", os);logger.info("图片水印添加成功。。。");} catch (Exception e) {logger.error("图片水印添加失败。。。", e);throw e;} finally {try {if (null != os) {os.close();}} catch (Exception e) {e.printStackTrace();}}}

还记得之前标红,要注意的代码么,现在改成如下

g.drawImage(img, x, y, img.getWidth(null), img.getHeight(null), null);

到此,用来合成的小图章在合成后,效果会较原来好很多


http://chatgpt.dhexx.cn/article/cDY8BDS3.shtml

相关文章

Java实现图片合成

功能 竖向合成多张大小不一致的图片,以最宽图片的为宽为合成后的宽度, 高为所有图片的总高度.图片宽度没有达到合成的宽度则填充部分使用白色画布填充. 代码 /*** 多张图片进行竖向合并成一张图片* param imageFiles 图片文件* param dstPath 合成图片路径* param hasLine 是…

html5 图片合成,H5案例分享:图片合成

图片合成 图片合成是h5案例中常用的展现方式,成功案例也有很多,譬如: 今天,小五就一个小demo来和大家磨叨磨叨图片合成的具体实现方法。 一、界面样式: 二、所用技术: easeljs + interact.js,easeljs是方便对canvas进行操作,interact.js主要是用来调整图片的位置大小的…

Python照片合成

文章目录 前言Github效果实现过程整体代码 前言 看电影的时候发现一个照片墙的功能,觉得这样生成照片挺好玩的,于是就动手用Python做了一下,觉得用来作照片纪念的效果可能会不错。 P:后面了解到我想做的功能叫蒙太奇拼图,所以这…

Python:合成图片

简介:PIL库中Image库封装了很多对图片处理的函数,支持对图片进行合成等操作。 相关攻略: python: ocr简单示例 - 识别验证码 python:彩色照转黑白照 python:个性签名 Python:利用cv2模块对图片进行灰度…

如何编辑图片合成图片?让我们来看看这些合成方法

相信大家在日常出行的时候,都会遇到想要和自己的朋友合照这种情况,却会因为社恐而不敢去向他人求助或者不想麻烦他人。所以通常我们会在同一个场景中拍摄照片,然后通过后期编辑将这些图片组合在一起,那么有的朋友会问,…

信息流产品和内容推荐算法

(一)什么是信息流产品 当下,信息流(资讯)和短视频是唯一两个在用户领域保持好的增长事态的细分行业。像其他比较成熟的互联网细分行业,比如说移动社交,电商,OTO这个细分行业&#x…

O2O商城系统,适合本地电商发展的商城系统!

说起商城系统,最适合本地电商发展的要数O2O商城系统了,O2O商城系统有什么优势? 一、本地O2O商城系统对商家的好处 1、本地O2O商城系统对消费人群定位比较明确,针对性强,而且本地的人消费习惯都比较了解。这样也容易形成固定的…

[转]从本地电子商务中走出来,6个很好的O2O模式解析

谓O2O就是线上到线下(Online to Offline) 请看以下几个非常好的O2O模式: Uber Uber是一个允许你通过手机购买一个私家车搭乘服务的应用。其运作方式如下:下载Uber应用,发出打车请求;几分钟内一辆私家车来到…

Oauth2协议

Oauth2协议 Oauth2简介角色常用术语令牌类型特点 授权模式授权码模式(Authorization Code)简化授权模式(Implicit)密码模式(Resource Owner PasswordCredentials)客户端模式(Client Credentials…

2021年中国医药O2O行业发展现状、发展问题及发展建议分析[图]

医药O2O模式指的是基于线下药店,利用现存资源,将门店的功能从售药转变为体验、提货和配送,贴合当地需求,完成和用户的最终接轨。 随着疫情防控成为常态化,医药电商与数字医疗也迎来了新的发展。医药的网上销售呈现出逐…

中国IT运维O2O市场发展研究及十四五前景规划分析报告2022-2027年

中国IT运维O2O市场发展研究及十四五前景规划分析报告2022-2027年 第1章:IT运维O2O的概念界定与内涵1.1 IT运维的概念界定与内涵 1.1.1 IT运维的概念 1.1.2 IT运维的演化历程 1.1.3 IT运维的内容 1.1.4 IT运维的流程 1.1.5 IT运维的价值 1.2 IT运维O2O的概念界定与内涵…

案例直播 | Pulsar Summit Asia 2022:Day 1 - 分论坛 1:腾讯、华为、有道、vivo、科大讯飞...

关于 Pulsar Summit Pulsar Summit 是 Apache Pulsar 社区年度盛会,它将分布在世界各地的 Apache Pulsar 项目 Contributor、Committer 和各企业 CTO/CIO、开发者、架构师、数据科学家,以及消息和流计算社区的精英召集在一起。于此盛会,大家分…

高德导航免费,那他靠什么收入?

来源 |一口Linux 一位工作了12年的软件工程师说:当你打开导航时,不需要任何费用,还会给高德公司带来丰厚的收入。当时我不信,去查了相关资料后,才知道这个行业不简单。 出门外出,对路线不熟时&a…

全球及中国前置汽车中冷器行业需求趋势分析及发展规划研究报告2021-2027年版

全球及中国前置汽车中冷器行业需求趋势分析及发展规划研究报告2021-2027年版 2020年,全球前置汽车中冷器市场规模达到了XX百万美元,预计2027年可以达到XX百万美元,年复合增长率(CAGR)为XX% (2021-2027)。中国市场规模增长快速,预计将由2020年的XX百万美元增长到2027年的X…

智能家居市场应采用精准营销策划模式

智能家居在全世界的发展都属于新鲜事物,在中国市场,智能家居行业参与进来的企业众多,包括跨国企业也包括本土的强势品牌都参与其中,唐太子、霍尼韦尔、莫顿、新加坡NICO、上海索博、广东安居宝、波创科技、海尔集团、天津瑞朗、联…

O2O营销结构思维导图模板分享

O2O营销是线上线下营销,随这互联网科技的发展,很多公司的业务从线下扩展到线上。但是在如此多行业的竞争下,怎样做好线上业务就成为最大的麻烦,下面是分享的O2O营销结构思维导图模板以及利用在线工具编辑思维导图的操作方法&#…

新项目从零到一DDD实战思考与总结

抱歉了,前面几篇DDD的文章我删除了,本篇是前面发表的几篇DDD的汇总,内容有修改。 领域驱动设计(DDD)是一种业务领域建模方法论、业务架构设计方法论,战略设计阶段从业务领域视角划分领域边界,抽…

设计模式 | 四、代理模式(静态代理、JDK动态代理、Cglib动态代理、手写动态代理核心部分)[ProxyPattern]

代理模式 源码:https://github.com/GiraffePeng/design-patterns 1、应用场景 在生活中,我们经常见到这样的场景,如:租房中介、售票黄牛、婚介、经纪人、快递、事务代理、非侵入式日志监听等,这些都是代理模式的实际…

23种设计模式 原型设计模式

原型模式的定义: 原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。 原型模式的结构: 原型模式主要包含3个角色: (1)Prototype(抽象原型类):声明克…

OTO模式 传统产业掘金互联网时代的利器

OTO模式 传统产业掘金互联网时代的利器 2013年10月16日 07:11 来源:中国经济网—《证券日报》 编者按:今年以来,一种新型的商业模式OTO模式迅速被国内众多传统企业所熟悉,很多传统企业借助OTO模式实现了从传统产业向互联网时…