java获取服务器上图片抠图并返回base64位编码,透明底图

编程入门 行业动态 更新时间:2024-10-11 19:23:36

java获取服务<a href=https://www.elefans.com/category/jswz/34/1771452.html style=器上图片抠图并返回base64位编码,透明底图"/>

java获取服务器上图片抠图并返回base64位编码,透明底图

项目需要获取服务器上人的签名,有的人签名不是透明底图,需要对图片进行处理,获取图片流数据处理后返回base64位编码,也可以指定文件路径保存下来
色差范围,根据红绿蓝平均值来,个人的处理图片不同,值也不同

一:使用hutool的方法

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version>
</dependency>

二、工具类


import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import sun.misc.BASE64Encoder;import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @Author ekkcole* @remark 图片链接转为base64编码*/
public class UrlToBase64Util {//base64前缀private static final String BASE64_PREFIX="data:image/png;base64,";public static void main(String[] args) throws Exception {String url="https://localhost:8080/upload/file/20221101/test.png";System.out.println(BASE64_PREFIX+imageUrlToBase64(url));}/*** 图片URL转Base64编码** @param imgUrl 图片URL* @return Base64编码*/public static String imageUrlToBase64(String imgUrl) {InputStream is = null;ByteArrayOutputStream outStream = null;try {if (!ObjectUtils.isEmpty(imgUrl)) {HttpResponse res = HttpRequest.get(imgUrl).execute();// 获取输入流is = res.bodyStream();outStream = new ByteArrayOutputStream();//创建一个Buffer字符串byte[] buffer = new byte[1024];//每次读取的字符串长度,如果为-1,代表全部读取完毕int len = 0;//使用输入流从buffer里把数据读取出来while ((len = is.read(buffer)) != -1) {//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度outStream.write(buffer, 0, len);}// 对字节数组Base64编码return encode(outStream.toByteArray());}} catch (Exception e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}if (outStream != null) {outStream.close();}} catch (Exception e) {e.printStackTrace();}}return null;}/*** 图片转字符串** @param image 图片Buffer* @return Base64编码*/public static String encode(byte[] image) {BASE64Encoder decoder = new BASE64Encoder();return replaceEnter(decoder.encode(image));}/*** 字符替换** @param str 字符串* @return 替换后的字符串*/public static String replaceEnter(String str) {String reg = "[\n-\r]";Pattern p = Patternpile(reg);Matcher m = p.matcher(str);return m.replaceAll("");}
}

三、实现方法


import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.ekkcole.utils.UrlToBase64Util;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;/*** 获取服务器上图片抠图并返回base64位图片数据*/
public class KouTuStream {// 抠纯白背景,色差范围0~255
//    public static int color_range = 210;// 自定义的背景色,可以根据红绿蓝的平均值写public static int color_range = 120;public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();// 服务器图片String imgUrl="//upload/image/20210903/16410394627191873.png";HttpResponse res = HttpRequest.get(imgUrl).execute();InputStream is = res.bodyStream();BufferedImage image = ImageIO.read(is);// 高度和宽度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的图片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)) {alpha = 0;} else {// 设置为不透明alpha = 255;}// #AARRGGBB 最前两位为透明度rgb = (alpha << 24) | (rgb & 0x00ffffff);bufferedImage.setRGB(x, y, rgb);}}// 绘制设置了RGB的新图片g2D.drawImage(bufferedImage, 0, 0, null);// 生成输出流图片为PNGByteArrayOutputStream outStream= new ByteArrayOutputStream();ImageIO.write(bufferedImage, "png", outStream);// 也可以指定文件路径保存// ImageIO.write(bufferedImage, "png", new File("C:\\Users\\ron\\Desktop\\测试图\\16410394627191873(1).png"));System.out.println("data:image/png;base64," + UrlToBase64Util.encode(outStream.toByteArray()));long end = System.currentTimeMillis();System.out.println("耗时:" + (end - start) + "毫秒");System.out.println("抠图成功");}// 判断是背景还是内容public static boolean colorInRange(int color) {int red = (color & 0xff0000) >> 16;// 获取color(RGB)中R位int green = (color & 0x00ff00) >> 8;// 获取color(RGB)中G位int blue = (color & 0x0000ff);// 获取color(RGB)中B位System.out.println("red+ = " + red + ",green+ = " + green + ",blue+ = " + blue);// 通过RGB三分量来判断当前颜色是否在指定的颜色区间内if (red >= color_range && green >= color_range && blue >= color_range) {return true;}return false;}
}

更多推荐

java获取服务器上图片抠图并返回base64位编码,透明底图

本文发布于:2024-02-06 08:39:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1747639.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:器上   抠图   透明   图片   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!