通过印模生成电子印章-Java源代码

发布时间:2023年12月27日

以下代码是处理印模图片的核心代码,通过以下代码可以将公章图片转换为电子印章图片。

制作方式分为四步:

1、在白纸上加盖印章;

2、把加盖印章的白纸扫描,形成图片;

3、将图片通过下面的代码进行自动透明化抠图处理

4、程序返回自动透明化抠图处理后的电子印章图片

5、处理后的电子印章效果(为防止企业公章安全,下图经过马赛克处理),如下图;

import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * @Description: 企业签章业务,将印模图片进行自动透明化抠图,形成电子印章图片
 * @ClassName: EntSealClipService
 * @copyright 北京资源律动科技有限公司 www.kaifangqian.com
 */
@Service
public class EntSealClipService {

    public byte[] clip(byte[] originByte, Integer colorRange){
        ByteArrayInputStream inputStream = new ByteArrayInputStream(originByte);
        BufferedImage image = null;
        try {
            image = ImageIO.read(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 高度和宽度
        int height = image.getHeight();
        int width = image.getWidth();

        // 生产背景透明和内容透明的图片
        ImageIcon imageIcon = new ImageIcon(image);
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
        Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics(); // 获取画笔
        g2D.drawImage(imageIcon.getImage(), 0, 0, null); // 绘制Image的图片,使用了imageIcon.getImage(),目的就是得到image,直接使用image就可以的

        int alpha = 0; // 图片透明度
        // 外层遍历是Y轴的像素
        for (int y = bufferedImage.getMinY(); y < bufferedImage.getHeight(); y++) {
            // 内层遍历是X轴的像素
            for (int x = bufferedImage.getMinX(); x < bufferedImage.getWidth(); x++) {
                int rgb = bufferedImage.getRGB(x, y);
                // 对当前颜色判断是否在指定区间内
                if (colorInRange(rgb,colorRange)){
                    // #AARRGGBB 最前两位为透明度
                    rgb = (alpha << 24) | (rgb & 0x00ffffff);
                    bufferedImage.setRGB(x, y, rgb);
                    alpha = 0;
                }else{
                    // 设置为不透明
                    alpha = 255;
                    // #AARRGGBB 最前两位为透明度
                    rgb = (alpha << 24) | (0xff0000);
                    bufferedImage.setRGB(x, y, rgb);
                }

            }
        }
        // 绘制设置了RGB的新图片,这一步感觉不用也可以只是透明地方的深浅有变化而已,就像蒙了两层的感觉
        g2D.drawImage(bufferedImage, 0, 0, null);

        // 生成图片为PNG
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            ImageIO.write(bufferedImage, "png", outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return outputStream.toByteArray();
    }

    // 判断是背景还是内容
    public boolean colorInRange(int color , Integer colorRange) {
        int red = (color & 0xff0000) >> 16;// 获取color(RGB)中R位
        int green = (color & 0x00ff00) >> 8;// 获取color(RGB)中G位
        int blue = (color & 0x0000ff);// 获取color(RGB)中B位
        // 通过RGB三分量来判断当前颜色是否在指定的颜色区间内
        if (red >= colorRange && green >= colorRange && blue >= colorRange){
            return true;
        }
        return false;
    }
}

开放签电子签章产品致力于将电子签章产品、技术开源、开放,让电子签署更加简单。我们更加相信秉承开放共享这一价值观,能够为产品与用户之间带来更多信任。

开放签官方网址:

?https://kaifangqian.com/icon-default.png?t=N7T8https://kaifangqian.com/

开放签电子签章系统开源工具版下载地址:

gitee源码下载:https://gitee.com/kaifangqianicon-default.png?t=N7T8https://gitee.com/kaifangqiangithub源码下载:https://github.com/kaifangqianicon-default.png?t=N7T8https://github.com/kaifangqian开源工具版体验地址:https://demo.kaifangqian.com/icon-default.png?t=N7T8https://demo.kaifangqian.com/

文章来源:https://blog.csdn.net/m0_72253539/article/details/135221641
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。