文章目录

  • 前言
  • 一、java BufferedImage 转 InputStream
  • 1. 描述
  • 2. 代码
  • a、逻辑代码
  • b、上传至OSS
  • 二、png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
  • 1. 案例描述
  • 2. 解决

前言

  • 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门: ​https://github.com/fengfanli/draw_poster_echarts​
  • 海报制作的所有博客和一些问题:
  • 总博客:java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题 ​ ​文字换行算法详解​ ​,传送门:​​java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解​​ ​ ​头像切割成圆形方法详解​ ​,传送门:​​java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解​​ ​ ​获取微信二维码详情​ ​,传送门:​​java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上​​ ​ ​java BufferedImage 转 InputStream​ ​​和 ​ ​png 图片合成到模板(另一个图片)上时,透明部分变成了黑色​ ​,传送门:​​java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色​​ ​ ​java 整合echarts 画出 折线图​ ​,传送门:
  • ​Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题​ ​,传送门:​​java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题​​ ​ ​项目部署到linux下中文不显示,echarts图上的中文也不显示问题​ ​,传送门:​​java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题​​
    • 本次博客主要是 稍微说一下​ ​java BufferedImage 转 InputStream​ ​​ 和 ​ ​png 图片合成到模板(另一个图片)上时,透明部分变成了黑色​ ​​,这里的代码都在 ​ ​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();