javacv 图片合成

java;gutter:false; /*<em> * 图片组合 </em>/ @Slf4j public class ComposeImageUtil {</p> <pre><code>/** * 合成商品链接 * * @param composeGoodsImageCmd * @param oSSUtil * @return */ public static String handleComposeGoodsImage(ComposeGoodsImageCmd composeGoodsImageCmd, OSSUtil oSSUtil) { //图片上传路径 String keyName = composeGoodsImageCmd.getKeyName(); //合成图宽高 Long imgWidth = composeGoodsImageCmd.getImgWidth(); Long imgHigh = composeGoodsImageCmd.getImgHigh(); //修正规则 String amendmentRules = composeGoodsImageCmd.getAmendmentRules(); //主商品有效面积(英文逗号隔开) String effectiveArea = composeGoodsImageCmd.getEffectiveArea(); //主商品中心点坐标(x_y,x_y,x_y) String centralPoint = composeGoodsImageCmd.getCentralPoint(); //主商品合成顺序(英文逗号隔开) String order = composeGoodsImageCmd.getOrder(); //前置商品数 Integer frontGoodsNum = composeGoodsImageCmd.getFrontGoodsNum() == null ? 0 : composeGoodsImageCmd.getFrontGoodsNum(); List collocationGoodsBaseList = composeGoodsImageCmd.getCollocationGoodsBaseDTOList(); if ( ObjectUtils.isEmpty(imgWidth) || imgWidth < 1 || ObjectUtils.isEmpty(imgHigh) || imgHigh < 1 || StringUtils.isBlank(amendmentRules) || StringUtils.isBlank(effectiveArea) || StringUtils.isBlank(centralPoint) || StringUtils.isBlank(order) || ObjectUtils.isEmpty(collocationGoodsBaseList) || StringUtils.isBlank(keyName) ) { log.error("handleComposeGoodsImage attribute is null. imgWidth ={},imgHigh ={},amendmentRules ={},EffectiveArea ={},CentralPoint ={},Order ={},collocationGoodsBaseList size={}", imgWidth, imgHigh, amendmentRules, effectiveArea, centralPoint, order, collocationGoodsBaseList.size()); return null; } //修正规则 Map> aidaCollocateAmendmentRuleMap = JSONObject.parseObject(amendmentRules, HashMap.class); //主商品有效面积转换 String[] EffectiveAreaStr = effectiveArea.split(","); long[] EffectiveAreaArray = new long[EffectiveAreaStr.length]; for (int EffectiveAreaindex = 0; EffectiveAreaindex < EffectiveAreaStr.length; EffectiveAreaindex++) { EffectiveAreaArray[EffectiveAreaindex] = Integer.parseInt(EffectiveAreaStr[EffectiveAreaindex]); } //主商品中心点坐标(x_y,x_y,x_y)转换 String[] CentralPointStr = centralPoint.split(","); int[][] CentralPointArray = new int[CentralPointStr.length][2]; for (int CentralPointindex = 0; CentralPointindex < CentralPointStr.length; CentralPointindex++) { String[] point = CentralPointStr[CentralPointindex].split("_"); CentralPointArray[CentralPointindex] = new int[]{Integer.parseInt(point[0]), Integer.parseInt(point[1])}; } //组合顺序转换 String[] orderStr = order.split(","); int[] orderArray = new int[orderStr.length]; for (int Orderindex = 0; Orderindex < orderStr.length; Orderindex++) { orderArray[Orderindex] = Integer.parseInt(orderStr[Orderindex]); } if ( collocationGoodsBaseList.size() != EffectiveAreaArray.length || collocationGoodsBaseList.size() != CentralPointArray.length || collocationGoodsBaseList.size() != orderArray.length ) { log.error("handleComposeGoodsImage data Num fail. collocationGoodsBaseList size={},EffectiveAreaArray size ={},aidaCollocateAmendmentRuleMap size ={},CentralPointArray size ={},orderArray size={}", collocationGoodsBaseList.size(), EffectiveAreaArray.length, aidaCollocateAmendmentRuleMap.size(), CentralPointArray.length, orderArray.length); //素材数量不足退出 return null; } //时间统计 StopWatch clock = new StopWatch(); clock.start(" amendmentRulesList = aidaCollocateAmendmentRuleMap.get(position); position = position - frontGoodsNum; clock.start(" imageUrlMap = new HashMap<>(); imageUrlMap.put(AidaCompositeConstant.AIDACOMPOSE_LAYERORDER_0, stickImgOrderCmd.getBackGroundUrl()); imageUrlMap.put(AidaCompositeConstant.AIDACOMPOSE_LAYERORDER_1, stickImgOrderCmd.getGoodsImageMasterUrl()); imageUrlMap.put(AidaCompositeConstant.AIDACOMPOSE_LAYERORDER_2, stickImgOrderCmd.getGoodsImageSlaveUrl()); //合成图片 BufferedImage bufferedImage = ComposeImageUtil.createPng(width.intValue(), heigh.intValue()); for (Byte layer : layerOrderArray) { String imageUrl = imageUrlMap.get(layer); if (StringUtils.isNotBlank(imageUrl)) { try { stickImg(bufferedImage, ImgUtil.read(new URL(imageUrl)), 0, 0); } catch (Exception e) { } } } return bufferedImage; } /** * 贴按顺序贴图返回组装对象 * * @param stickImgOrderCmd 配饰参数 */ public static List stickImgOrderToJson(StickImgOrderCmd stickImgOrderCmd) { if (ObjectUtils.isEmpty(stickImgOrderCmd)) { return null; } Long width = stickImgOrderCmd.getWidth(); Long heigh = stickImgOrderCmd.getHeigh(); //贴图顺序 Byte[] layerOrderArray = {0, 1, 2}; if (StringUtils.isNotBlank(stickImgOrderCmd.getLayerOrder())) { String[] layerOrderSplit = stickImgOrderCmd.getLayerOrder().split(","); layerOrderArray = new Byte[layerOrderSplit.length]; for (int layerOrderIndex = 0; layerOrderIndex < layerOrderSplit.length; layerOrderIndex++) { layerOrderArray[layerOrderIndex] = Byte.parseByte(layerOrderSplit[layerOrderIndex]); } } //图片的图片地址 Map imageUrlMap = new HashMap<>(); imageUrlMap.put(AidaCompositeConstant.AIDACOMPOSE_LAYERORDER_0, stickImgOrderCmd.getBackGroundUrl()); imageUrlMap.put(AidaCompositeConstant.AIDACOMPOSE_LAYERORDER_1, stickImgOrderCmd.getGoodsImageMasterUrl()); imageUrlMap.put(AidaCompositeConstant.AIDACOMPOSE_LAYERORDER_2, stickImgOrderCmd.getGoodsImageSlaveUrl()); //合成图片 //中心点坐标x Long centerPointX = width / 2; //中心点坐标y Long centerPointY = heigh / 2; //数据组装 List coordinateList = new ArrayList<>(); for (int layerOrder = 0; layerOrder < layerOrderArray.length; layerOrder++) { Byte layer = layerOrderArray[layerOrder]; String imageUrl = imageUrlMap.get(layer); if (StringUtils.isNotBlank(imageUrl)) { ComposeImageCoordinateDTO composeImageCoordinate = new ComposeImageCoordinateDTO(); composeImageCoordinate.setWidth(width); composeImageCoordinate.setHeigh(heigh); composeImageCoordinate.setCenterPointX(centerPointX.intValue()); composeImageCoordinate.setCenterPointY(centerPointY.intValue()); composeImageCoordinate.setImageUrl(OSSUrlUtil.specifyWidthAndHeight(imageUrl, width.intValue(), heigh.intValue())); composeImageCoordinate.setLayer(layerOrder); coordinateList.add(composeImageCoordinate); } } return coordinateList; } /** * 创建透明图 * * @param width * @param height * @return */ public static BufferedImage createPng(int width, int height) { // 创建BufferedImage对象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取Graphics2D Graphics2D g2d = image.createGraphics(); // ---------- 背景透明开始 ----------------- image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); g2d.dispose(); // ---------- 背景透明代码结束 ----------------- return image; } /** * 计算转换后目标矩形的宽高 * * @param width * @param height * @param angle 角度 * @return 目标矩形 */ private static int[] calcRotatedSize(int width, int height, int angle) { if (angle == 0 || angle % 360 == 0) { return new int[]{width, height}; } double cos = Math.abs(Math.cos(Math.toRadians(angle))); double sin = Math.abs(Math.sin(Math.toRadians(angle))); int des_width = (int) (width * cos) + (int) (height * sin); int des_height = (int) (height * cos) + (int) (width * sin); return new int[]{des_width, des_height}; } /** * 贴图片 * * @param srcImage 底图 * @param pressImg 贴图 * @param x 坐标x(必填) * @param y 坐标y(必填) */ public static void stickImg(BufferedImage srcImage, BufferedImage pressImg, int x, int y) { if (ObjectUtils.isEmpty(srcImage) || ObjectUtils.isEmpty(pressImg)) { return; } //将图片放到指定位置 Graphics2D graphics2D = srcImage.createGraphics(); graphics2D.drawImage(pressImg, x, y, null); graphics2D.dispose(); } /** * 贴文字 * * @param srcImage 底图 * @param color 颜色 * @param font 字体 * @param text 文本 * @param x 坐标x(必填) * @param y 坐标y(必填) */ public static void stickText(BufferedImage srcImage, Color color, Font font, String text, int x, int y) { if (ObjectUtils.isEmpty(srcImage) || ObjectUtils.isEmpty(font) || StringUtils.isBlank(text)) { return; } // 创建画笔 Graphics2D graphics2D = srcImage.createGraphics(); // 设置画笔颜色为白色 // pen.setColor(Color.WHITE); graphics2D.setColor(color); // 设置画笔字体样式为微软雅黑,斜体,文字大小为20px graphics2D.setFont(font); // 写上水印文字和坐标 graphics2D.drawString(text, x, y); graphics2D.dispose(); } </code></pre> <p>}

Original: https://www.cnblogs.com/zxf330301/p/16409482.html
Author: 随风而逝,只是飘零
Title: javacv 图片合成

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537819/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java观察者模式的实现

    在看博客里,有个订阅功能,当你订阅后,当博主发布新的博客,你都能收到消息。这是如何实现的?是不是后台有个线程在不停的轮询?如果是这样的话,显然太耗资源,如果当博客在发布时,找到所有…

    Java 2023年5月29日
    066
  • 认识Spring Cloud Gateway

    一、Spring Cloud Gateway是什么 Spring Cloud Gateway 基于 Spring Boot 2, 是 Spring Cloud 的 全新 项目, 该…

    Java 2023年5月30日
    084
  • RabbitMQ消息可靠性、死信交换机、消息堆积问题

    消息可靠性 生产者消息确认 示例 消费者消息确认 示例 死信交换机 – 例子 高可用问题 消息堆积问题 惰性队列 参考 消息可靠性 确保消息至少被消费了一次(不丢失) …

    Java 2023年6月9日
    083
  • Maven 依赖调解源码解析(七):总结

    在本系列文章中,我们搭建了一个简单的多模块项目,以实验的形式,从源码角度解析了四种依赖调节原则。涉及到了传递依赖的两种调解原则、一种同文件内的覆盖原则,以及 dependencyM…

    Java 2023年6月16日
    054
  • JDK9-JDK14 相关新特性说明及使用

    一、Java9 发布于 2017 年 9 月 21 日 。作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块…

    Java 2023年5月30日
    072
  • 干货:RabbitMQ消息队列基本原理介绍

    RabbitMQ 是高级消息队列协议(AMQP)的开源消息代理软件。 RabbitMQ 服务器是用 Erlang 语言编写的,消息系统允许软件、应用相互连接和扩展。这些应用可以相互…

    Java 2023年5月30日
    095
  • MarkDown Day001

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/shiguangzheng/p/14750559.htm…

    Java 2023年6月14日
    083
  • 461. Hamming Distance

    The Hamming distance between two integers is the number of positions at which the correspo…

    Java 2023年6月15日
    079
  • Bigdecimal的格式化以及长度判断

    Bigdecimal的格式化 需求 Bigdecimal的长度太长 需要处理 1.定义一种格式 decimalFormat.setRoundingMode (RoundingMod…

    Java 2023年6月9日
    070
  • 是否有人会想起

    闲书在手的夏日午后时间顺着页码漫流喧嚣的蝉声乱不了心的静寂湿热的夏风也吹不走淡淡的轻愁 找不回来 弄丢的电台嘈杂声里有时也蕴着期待此刻大把青春无处挥霍的无奈注定有一天追悔莫及 暗自…

    Java 2023年6月5日
    080
  • 我也学习JAVA多线程-join

    【原文链接】:https://blog.tecchen.tech ,博文同步发布到博客园。由于精力有限,对文章的更新可能不能及时同步,请点击上面的原文链接访问最新内容。欢迎访问我的…

    Java 2023年6月6日
    071
  • microsoft docx document operation with Java POI library

    microsoft docx document operation with Java POI library word-combiner support combiner mul…

    Java 2023年5月29日
    064
  • 20220723-Mac上使用IntelliJ IDEA

    IDEA快捷键 IDEA模板 常用模板快捷键 个人随笔 软件:IntelliJ IDEA电脑:Mac IDEA快捷键 打开/关闭 项目视图 快捷键:⌘ + 1 运行项目 快捷键:⌃…

    Java 2023年6月15日
    060
  • 生成一个session id

    var genSessionId = function(length){ var str = genSessionId.characters; if ( !"0&quot…

    Java 2023年5月30日
    090
  • 一万了解 Gateway 知识点

    1.什么是 网关 API 网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中处理一些非业务功能的逻辑,例如权限验证、监控、缓存、请求路由等。 网关的核心作用就是路…

    Java 2023年6月5日
    092
  • Java 虚拟机的概念是怎么来的

    JVM 是 Java 的精髓部分之一。 Java 最开始是怎么来的?其实是从 C++ 上过来的,所以 Java 上面很多的面向对象特性都有 C++ 的影子。 C/C++ 最受诟病的…

    Java 2023年5月29日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球