java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。

前言

  1. 文字换行算法详解,传送门:java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
  2. 头像切割成圆形方法详解,传送门:java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
  3. 获取微信二维码详情,传送门:java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上
  4. java BufferedImage 转 InputStreampng 图片合成到模板(另一个图片)上时,透明部分变成了黑色,传送门:java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
  5. java 整合echarts 画出 折线图,传送门:
  6. Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题,传送门:java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
  7. 项目部署到linux下中文不显示,echarts图上的中文也不显示问题,传送门:java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
  • 本次博客主要是 稍微说一下java BufferedImage 转 InputStreampng 图片合成到模板(另一个图片)上时,透明部分变成了黑色,这里的代码都在 PosterUtil.java

一、java BufferedImage 转 InputStream

1. 描述

  1. java 通过 Graphics2D 创建的 图片 返回的是 BufferedImage类型。
  2. 需要将BufferedImage 转化为 输入流InputStream 上传到 OSS

2. 代码

a、逻辑代码

            // 上传到 OSS
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", os);
            InputStream inputStream = new ByteArrayInputStream(os.toByteArray());
            // map = uploadShareSeaImg(inputStream, "bakeShare", request);
            map = uploadShareSeaImg(inputStream, "bakeShare");

b、上传至OSS

    /**
     * @return java.util.Map<java.lang.String , java.lang.Object>
     * @Author fengfanli
     * @Description //TODO 上传生成的海报 上传到云服务器 并返回给前端 url
     * @Date 16:54 2021/4/1
     * @Param [inputStream, shareCategory, request]
     **/
    public static Map<String, Object> uploadShareSeaImg(InputStream inputStream, String shareCategory) {
        // 获取用户的目的是为了 1、文件新名称,2、将海报添加到数据库做记录
        // XfxUserbaseModel user = upmsSessionDao.getUser(request); // 通过 request 获取当前用户信息。
        XfxUserbaseModel user = new XfxUserbaseModel(); // 就是一个用户实体类
        user.setId(1);
        // 新名称
        String newFileName = UUID.randomUUID().toString().replace("-", "") + ".png";
        String key = "wx/" + user.getId() + "/" + shareCategory + "/" + newFileName;
        String ok = OssUtil.uploadImg(key, inputStream);
        if (!"OK".equals(ok)) {
            System.out.println("PosterController oss uploadShareSeaImg fail:" + user.getId());
        }
        Map<String, Object> map = new HashMap<>(2);
        map.put("ossKey", key);
        map.put("fileUrl", OssUtil.getImgUrl(key));
        // 将做好的海报URL oss key 放到 数据库
        PhotoSeaMainModel model = new PhotoSeaMainModel();
        model.setUserId(user.getId());
        model.setTitle(shareCategory);
        model.setFileOss(key);
        // photoSeaService.addPhotoSeaModel(model);
        return map;
    }

二、png 图片合成到模板(另一个图片)上时,透明部分变成了黑色

1. 案例描述

我这有一个案例,美工将png照片给我,上面有一部分是透明的。

刚开始,我就直接将这个png照片合成到另一张照片上,但是,透明的部分变成了黑色。后来我测试了下,用BufferedImage 画了一张照片,保存到本地一看,BufferedImage 默认背景颜色就是黑色。所以也就明白了为什么png照片为什么合成到另一张照片后,透明部分变成了黑色。

2. 解决

直接上代码

    /**
     * @return void
     * @Author fengfanli
     * @Description //TODO 画图 改变背景颜色
     * TODO  重点1 :png图片合成到另一个图片时,透明地带出现黑色情况, 原因:Graphics2D 创建图片背景为黑色
     * @Date 16:31 2021/4/8
     * @Param [canvas, logo, logoX, logoY]
     **/
    public static void drawImageAndChangeBackgroundColor(BufferedImage canvas, BufferedImage logo, Integer logoX, Integer logoY) throws IOException {
        Graphics2D g2d = canvas.createGraphics();

        // 解决png透明图片会变黑的问题(画一个新图片,然后合成,记得透明度)
        Graphics2D graphics = logo.createGraphics();
        BufferedImage compatibleImage = graphics.getDeviceConfiguration().createCompatibleImage(logo.getWidth(null), logo.getHeight(null), Transparency.TRANSLUCENT);
        // 下面这行也可以代替上面这行
        //BufferedImage compatibleImage = new BufferedImage(image.getWidth(), image.getHeight(), Transparency.TRANSLUCENT);
        graphics = compatibleImage.createGraphics();
        graphics.drawImage(logo, 0, 0, null);
        graphics.dispose();

        // 合成图片
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2d.drawImage(compatibleImage, logoX, logoY, null);
        g2d.dispose();
    }

主要是其中的这几行,如下所示:

// 解决png透明图片会变黑的问题(画一个新图片,然后合成,记得透明度)
Graphics2D graphics = logo.createGraphics();
BufferedImage compatibleImage = graphics.getDeviceConfiguration().createCompatibleImage(logo.getWidth(null), logo.getHeight(null), Transparency.TRANSLUCENT);
// 下面这行也可以代替上面这行
//BufferedImage compatibleImage = new BufferedImage(image.getWidth(), image.getHeight(), Transparency.TRANSLUCENT);
graphics = compatibleImage.createGraphics();
graphics.drawImage(logo, 0, 0, null);
graphics.dispose();
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
23小时前
|
算法 Java Linux
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
这篇文章讨论了在Linux环境下使用Java Graphics2D合成图片时遇到的中文显示问题,并提供了解决方案,包括如何在Linux系统中添加中文字体库。
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
|
23小时前
|
存储 算法 Java
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
这篇文章是关于如何在Java中使用Graphics2D的RenderingHints方法来提高海报制作的图像质量和文字清晰度,包括抗锯齿和解决文字不清晰问题的技术详解。
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
|
23小时前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
23小时前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
23小时前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
|
23小时前
|
算法 小程序 Java
java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上
这篇文章介绍了如何使用Java获取微信小程序的二维码,并将其调整大小后合成到海报(另一张图片)上。
|
23小时前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
|
3月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
2月前
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
|
3月前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。

热门文章

最新文章