Java基础之简单的图片处理

一、前言

先使用一个模板图片,在图片上添加图片或者文字都可以。

二、依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.18</version>
    <optional>true</optional>
</dependency>

三、封装数据类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.awt.*;

/**
 * 坐标数据
 * @author tyg
 * @date 2021-04-23 14:33
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PositionPO {

    /** 显示的数据 */
    private Object data;
    /** X轴坐标 */
    private float x;
    /** Y轴坐标 */
    private float y;
    /** 宽度 */
    private float w;
    /** 高度 */
    private float h;
    /** 字体 */
    private Font font;

    public PositionPO(Object data, float x, float y, float w, float h) {
        this.data = data;
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }

    public PositionPO(Object data, float x, float y) {
        this.data = data;
        this.x = x;
        this.y = y;
    }

    public PositionPO(Object data, float x, float y, Font font) {
        this.data = data;
        this.x = x;
        this.y = y;
        this.font = font;
    }

    public PositionPO(float x, float y, float w, float h) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }
}
import com.yt.distributor.po.pdf.PositionPO;
import lombok.Data;

import java.util.List;

/**
 * 邀请海报
 * @author tyg
 * @date 2021-04-24 14:52
 */
@Data
public class ImageHandlePO {

    /** 文字 */
    private List<PositionPO> textList;
    /** 图片 */
    private List<PositionPO> imageList;

    public ImageHandlePO(List<PositionPO> textList, List<PositionPO> imageList) {
        this.textList = textList;
        this.imageList = imageList;
    }
}

四、常量类

package com.yt.distributor.constant;

import org.springframework.core.io.ClassPathResource;

import java.awt.*;
import java.io.File;
import java.io.IOException;

/**
 * 图片常量
 * @author tyg
 * @date 2021-04-24 16:59
 */
public class ImageConstant {

    /** 透明度 */
    public static final float PELLUCIDITY = 1.0F;
    /** 字体 */
    public static final Font FONT = new Font("微软雅黑", Font.BOLD, 18);
    /** 邀请海报模板图片源文件 */
    public static File POSTER_SOURCE_FILE;
    /** 图片默认格式 */
    public static final String FORMAT = "png";

    static{
        try {
            ClassPathResource resource = new ClassPathResource("conf/poster.jpg");
            POSTER_SOURCE_FILE = resource.getFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

五、图像处理类

import com.yt.distributor.constant.ImageConstant;
import com.yt.distributor.po.img.ImageHandlePO;
import com.yt.distributor.po.pdf.PositionPO;
import lombok.extern.log4j.Log4j2;
import net.dreamlu.mica.core.utils.$;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * 图像合成处理
  * 注:图像处理的原点坐标在:左上角,距离为像素
 * @author tyg
 * @date 2021-04-24 17:45
 */
@Log4j2
public class PictureSynthesis {

    /** 原模板图片文件 */
    public static final Object FLAG = true;
    /** 原模板图片文件 */
    public static File sourceFile;

    public static void main(String[] args) throws IOException {
        // 生成二维码
        BufferedImage image = QrCodeGenerator.generateQrCode("http://www.baiud.com/index.html?id=13", 192, 192);
        // 图片
        List<PositionPO> imageList = new ArrayList<>();
        imageList.add(new PositionPO(ImageIO.read(new URL("https://thirdwx.qlogo.cn/mmopen/vi_32/AtTHbmrMict69vB7ocDMbstibgvwxpK51bOoNkQiaemrImnicUK2L9OoF1JibHiceLwY53ibiaicJQibuEwLNFicJiaYcQHRiaw/132")), 120F, 1688F, 192F, 192F));
        imageList.add(new PositionPO(image, 785F, 1632F, 192F , 192F));

        // 文字
        Font font = new Font("微软雅黑", Font.PLAIN, 30);
        List<PositionPO> textList = new ArrayList<>();
        textList.add(new PositionPO("颜魔子辰", 120F, 1660F, font));
        textList.add(new PositionPO("颜魔子辰邀请您", 336F, 1758F, font));
        textList.add(new PositionPO("加入某某小店。", 336F, 1796F, font));
        textList.add(new PositionPO("长按可识别二维码", 760F, 1880F, font));

        String sourcePath = "C:\\Users\\Administrator\\Desktop\\poster.jpg";
        String savePath = "C:\\Users\\Administrator\\Desktop\\poster-handle.jpg";
        // 输出水印图片
        handleImage(new ImageHandlePO(textList, imageList), new File(sourcePath), savePath);
    }

    /**
     * 图片处理(返回输入流)
     * @param po            处理的数据
     * @author tyg
     * @date 2021-04-14 15:45
     * @return InputStream
     */
    public static InputStream handleImage(ImageHandlePO po, File sourceFile) throws IOException {
        synchronized (FLAG) {
            PictureSynthesis.sourceFile = sourceFile;
            //图片处理,导出数据
            BufferedImage image = watermark(po);
            return getInputStream(image);
        }
    }

    /**
     * 图片处理(输出到文件中)
     * @param po            处理的数据
     * @param saveFilePath  保存的路径
     * @author tyg
     * @date   2017年9月6日下午12:53:11
     */
    public static void handleImage(ImageHandlePO po, File sourceFile, String saveFilePath) throws IOException {
        synchronized (FLAG) {
            PictureSynthesis.sourceFile = sourceFile;
            // 构建叠加层
            BufferedImage buffImg = watermark(po);
            // 输出水印图片
            generateWaterFile(buffImg, saveFilePath);
        }
    }

    /**
     * 构建叠加层
     * 图像处理的原点坐标在:左上角
     * @param po 处理的数据
     * @throws IOException io异常
     * @return BufferedImage 生成水印并返回java.awt.image.BufferedImage
     */
    private static BufferedImage watermark(ImageHandlePO po) throws IOException {
        // 获取底图
        BufferedImage buffImg = ImageIO.read(sourceFile);
        // 创建Graphics2D对象,用在底图对象上绘图
        Graphics2D g2d = buffImg.createGraphics();

        // 处理文字
        if ($.isNotEmpty(po.getTextList())){
            for (PositionPO pp : po.getTextList()){
                g2d.setColor(Color.black);
                g2d.setFont( pp.getFont() == null ? ImageConstant.FONT : pp.getFont());
                g2d.drawString(pp.getData().toString(), pp.getX(), pp.getY());
            }
        }
        // 处理图片
        if ($.isNotEmpty(po.getImageList())){
            for (PositionPO pp : po.getImageList()){
                BufferedImage image = (BufferedImage) pp.getData();
                // 获取层图的宽度
                int width = pp.getW() <= 0 ? image.getWidth() : (int) pp.getW();
                // 获取层图的高度
                int height = pp.getH() <= 0 ? image.getHeight() : (int) pp.getH();
                // 在图形和图像中实现混合和透明效果
                g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ImageConstant.PELLUCIDITY));
                // 绘制
                g2d.drawImage(image, (int)pp.getX(), (int)pp.getY(), width, height, null);
            }
        }
        // 释放图形上下文使用的系统资源
        g2d.dispose();
        return buffImg;
    }

    /**
     * 输出水印图片
     * @param buffImg  图像加水印之后的BufferedImage对象
     * @param savePath 图像加水印之后的保存路径
     * @author tyg
     * @date 2021-04-24 16:19
     */
    private static void generateWaterFile(BufferedImage buffImg, String savePath) {
        int temp = savePath.lastIndexOf(".") + 1;
        try {
            ImageIO.write(buffImg, savePath.substring(temp), new File(savePath));
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    /**
     * 获取系统所支持的字体
     * @author tyg
     * @date 2021-04-24 16:19
     */
    private static void getFonts(){
        String[] fontNames=GraphicsEnvironment.getLocalGraphicsEnvironment().
                getAvailableFontFamilyNames();
        for(String fontName:fontNames){
            System.out.println(fontName);
        }
    }

    /**
     * 获取图片输入流
     * @param image	图片
     * @author tyg
     * @date 2021-04-14 17:14
     * @return java.io.InputStream
     */
    public static InputStream getInputStream(BufferedImage image){
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, ImageConstant.FORMAT, os);
            return new ByteArrayInputStream(os.toByteArray());
        } catch (IOException e) {
            log.error("提示:",e);
        }
        return null;
    }

}

六、效果图

以上的数据都是按图片的1080*1920像素来设定的,下面红框部分是动态生成的。

到此这篇关于Java基础之简单的图片处理的文章就介绍到这了,更多相关Java图片处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java Thumbnails 图片处理的使用

    在后端开发的过程中,都逃不开与文件传输特别是图片的传输打交道,但是因为现在各种拍照设备发展越来越快,拍出的照片更是越来越清晰,但是照片文件的大小也是越来越大了,手机拍照小则2M大则30M这在网络传输过程中谁顶得住呀!所以在用户发布照片,后端对图像文件进行保存的过程中压缩图像文件是必不可少的一个过程. 而Thumbnails就是一个很好的图像处理工具,他把复杂的图像处理封装的很好,只需要短短的一行代码就能完成对图像的压缩. Thumbnails支持: 指定大小进行缩放 按照比例进行缩放 不按照比例

  • Java图片处理开源框架Thumbnailator

    图片处理是当今软件开发中非常重要的一环,然而处理图片的开源框架却并不多.现金网上流传的Java处理图片的代码,虽然可对图片进行简单处理,但效果并不理想.虽然也有些其他解决方案,但都摆脱不了繁琐,使用起来十分不方便. 为了解决这个问题,我也是在网上找了好久,看了很多资料,功夫不负有心人,最终找到了一个处理图片十分棒的开源框架.特此拿出来与大家分享. Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象

  • 详解java google Thumbnails 图片处理

    在后端开发的过程中,都逃不开与文件传输特别是图片的传输打交道,但是因为现在各种拍照设备发展越来越快,拍出的照片更是越来越清晰,但是照片文件的大小也是越来越大了,手机拍照小则2M大则30M这在网络传输过程中谁顶得住呀!所以在用户发布照片,后端对图像文件进行保存的过程中压缩图像文件是必不可少的一个过程. 而Thumbnails就是一个很好的图像处理工具,他把复杂的图像处理封装的很好,只需要短短的一行代码就能完成对图像的压缩. Thumbnails支持: 指定大小进行缩放 按照比例进行缩放 不按照比例

  • Java图片处理之获取gif图一帧图片的两种方法

    前言 本文主要给大家介绍了关于Java获取gif图一帧图片的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.Java原生代码实现gif获取一帧图片 先看测试代码: public static void main(String[] args) { /*这儿填写你存放要缩小图片的文件夹全地址*/ String src = "c:/5.gif" ; /*这儿填写你转化后的图片存放的文件夹*/ String tar = "c:/5_frame_2.jp

  • Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】

    本文实例讲述了Java实现的微信图片处理工具类.分享给大家供大家参考,具体如下: 现在 外面核心,图片文章比较少,看了拷贝代码,而用不了,用相应jar包处理,很多等比例缩放,达不到 想要的给予的期望:本工具类,是之前做微信打印机写的 基于java自带的类,基于rgb. package com.zjpz.util; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt

  • 简单的java图片处理类(图片水印 图片缩放)

    复制代码 代码如下: import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Toolkit;import java.awt.color.ColorSpace;import java.awt.geom.AffineTransfo

  • Java图片处理 (文字水印、图片水印、缩放、补白)代码实例

    package com.hmw.picMark; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.im

  • Java基础之简单的图片处理

    一.前言 先使用一个模板图片,在图片上添加图片或者文字都可以. 二.依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.18</version> <optional>true</optional> </dependency> 三.封装数据类 i

  • Java基础之简单介绍一下Maven

    一.Maven是什么? Maven是一个跨平台的项目管理工具.作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理,是一个自动化构建工具.maven是Apache的顶级项目,解释为"专家,内行",它是一个项目管理的工具,maven自身是纯java开发的( Theresult is a tool that can now be used for building and managing any Java-basedproject)

  • Java基础之打印万年历的简单实现(案例)

    问题:输入年,月,打印对应年月的日历. 示例: 问题分析: 1,首先1970年是Unix系统诞生的时间,1970年成为Unix的元年,1970年1月1号是星期四,现在大多的手机的日历功能只能显示到1970年1月1日这一天; 2,要想打印某年某月的日历,首先应该计算出这个月1号是星期几? 解决1号是星期几? 2.1:先计算出年天数,即截至这一年1月1号的天数,用for循环,从1970年开始,闰年+366,平年+365; 2.2:计算出月天数,即截至本月1号的天数,用for循环,从1月份开始,算出月

  • Java实现的简单图片上传功能示例

    本文实例讲述了Java实现的简单图片上传功能.分享给大家供大家参考,具体如下: import java.io.*; import java.net.*; /* *发送端 */ class picsend { public static void main(String[] args) throws Exception { if(args.length!=1) { System.out.println("请选择一张.jpg图片"); return; } File file = new F

  • Java 基础 byte[]与各种数据类型互相转换的简单示例

    Java 基础 byte[]与各种数据类型互相转换的简单示例 这里对byte[]类型对long,int,double,float,short,cahr,object,string类型相互转换的实例, 在socket开发过程中,通常需要将一些具体的值(这些值可能是各种Java类型)转化为byte[]类型,为此我总结了如下这个示例,贴出来,以便经常翻看: public class TestCase { /** * short到字节数组的转换. */ public static byte[] shor

  • Java基础之Thymeleaf的简单使用

    Java代码 package com.zzx.controller; import com.zzx.model.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Arrays; /** * @date:

  • maven基础教程——简单了解maven的特点与功能

    Maven 翻译为"专家"."内行",是 Apache 下的一个纯 Java 开发的开源项目.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建.报告和文档等步骤. Maven 是一个项目管理工具,可以对 Java 项目进行构建.依赖管理. Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目.Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立

  • Java基础之文件概述

    一.基本概念和常识 下面,我们先介绍一些基本概念和常识,包括二进制思维.文件类型.文本文件的编码.文件系统和文件读写等. 1.1 二进制思维 为了透彻理解文件,我们首先要有一个二进制思维. 所有文件, 不论是可执行文件.图片文件.视频文件.Word文件.压缩文件.txt 文件,都没什么可神秘的,它们都是以0和1的二进制形式保存的.我们 所看到的图片.视频.文本,都是应用程序对这些二进制的解析结果. 作为程序员,我们应该有一个编辑器,能查看文件的二进制形式, 比如UltraEdit,它支持以十六进

  • Day14基础不牢地动山摇-Java基础

    目录 1.定时器 2.UUID类 3.Base64加密处理 加密处理 多次加密 4.ThreadLocal类 5.IO-File类 5.1 基本操作 5.2 取得文件信息 5.3 综合案例:目录列表 6.IO- 字节流与字符流 6.1 字节输出流:OutputStream 6.2 字节输入流:InputStream 6.3 字符输出流:Writer 6.4 字符输入流:Reader 6.5 字节流与字符流区别 7.转换流 1.定时器 推动整个计算机硬件的发展的核心关键性技术就是时钟.所以在企业开

  • Java 基础语法之解析 Java 的包和继承

    目录 一.包 1. 概念 2. 使用方式 3. 静态导入 4. 创建包 5. 包的访问权限 6. 常见的系统包 二.继承 1. 概念 2. 语法规则(含 super 使用) 3. protected 关键字 4. 更复杂的继承关系 5. final 关键字 三.组合 四.总结(含谜底) 一.包 1. 概念 根据定义:包是组织类的一种方式 那么为什么要组织类呢? 简单来讲就是保证类的唯一性,就比如在以后的工作中,如果大家一起开发一个项目,大家可能在自己的代码中都写到了一个 Test 类,而如果出现

随机推荐