当前位置:主页 > java教程 > Java 生成透明图片

Java 生成透明图片的设置实现demo

发布:2023-04-08 15:45:02 59


为找教程的网友们整理了相关的编程文章,网友简秀隽根据主题投稿了本篇教程内容,涉及到Java、生成透明图片、Java、设置图片透明、Java 生成透明图片相关内容,已被976网友关注,内容中涉及的知识点可以在下方直接下载获取。

Java 生成透明图片

设置图片透明

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.\*;
import java.awt.\*;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/\*\*
 \* 图片处理工具类
 \*
 \* @author maruifu
 \*/
public class ImageUtils1 {
    private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
    public static void main(String[] args) {
        String text = "我是小马哥";
        String filePath = "/Users/maruifu/Desktop/1.png";
        //生成指定文字透明图片
        createImage(text,filePath,"宋体",45);
        //设置指定图片透明
        //setColorInRange(path,path);
    }
    /\*\*
     \* 动态获取文字宽高
     \* @param text 文字
     \* @param font 字体
     \* @return
     \*/
    private static int[] getWidthAndHeight(String text, Font font) {
        Rectangle2D r = font.getStringBounds(text, new FontRenderContext(
                AffineTransform.getScaleInstance(1, 1), false, false));
        int unitHeight = (int) Math.floor(r.getHeight());
        // 获取整个str用了font样式的宽度这里用四舍五入后+1保证宽度绝对能容纳这个字符串作为图片的宽度
        int width = (int) Math.round(r.getWidth()) + 1;
        // 把单个字符的高度+3保证高度绝对能容纳字符串作为图片的高度
        int height = unitHeight + 3;
        return new int[]{width, height};
    }
    /\*\*
     \* 生成指定文字透明图片
     \* @param text 文字内容 "我是小马哥"
     \* @param filePath 生成地址 "/Users/maruifu/Desktop/123.png"
     \* @param fontName 字体名称 "宋体"
     \* @param fontSize 字体大小 45
     \*/
    public static void createImage(String text, String filePath,String fontName,int fontSize)  {
        ImageOutputStream imageOutputStream = null;
        try {
            Font font = new Font(fontName, Font.BOLD,fontSize);
            // 获取font的样式应用在输出内容上整个的宽高
            int[] arr = getWidthAndHeight(text, font);
            // 设置背景宽高
            int width = arr[0];
            int height = arr[1];
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE\_4BYTE\_ABGR);
            // 获取图形上下文对象
            Graphics2D graphics = (Graphics2D)image.getGraphics();
            graphics.clearRect(0, 0, width, height);
            // 填充
            graphics.fillRect(0, 0, width, height);
            // 设定字体大小及样式
            graphics.setFont(font);
            // 字体颜色
            graphics.setColor(Color.BLACK);
            // 描绘字符串
            graphics.drawString(text, 0,   font.getSize());
            // 图片透明度
            setTransparency(image, graphics);
            File jpgFile = new File(filePath);
            if(!jpgFile.exists()) {
                jpgFile.createNewFile();
            }
            // 创建图片输出流对象,基于文件对象
            imageOutputStream = ImageIO.createImageOutputStream(jpgFile);
            // 写入
            ImageIO.write(image, FilenameUtils.getExtension(filePath),imageOutputStream);
        } catch (IOException e) {
            log.error("生成图片失败{}",e);
        } finally {
            // 关闭流
            IOUtils.closeQuietly(imageOutputStream);
        }
    }
    private static void setTransparency(BufferedImage image, Graphics2D graphics) {
        int alpha = 0;
        // 外层遍历是Y轴的像素
        for (int y = image.getMinY(); y < image.getHeight(); y++) {
            // 内层遍历是X轴的像素
            for (int x = image.getMinX(); x < image.getWidth(); x++) {
                int rgb = image.getRGB(x, y);
                // 对当前颜色判断是否在指定区间内
                if (colorInRange(rgb)) {
                    alpha = 0;
                } else {
                    // 设置为不透明
                    alpha = 255;
                }
                // #AARRGGBB 最前两位为透明度
                rgb = (alpha << 24) | (rgb & 0x00ffffff);
                image.setRGB(x, y, rgb);
            }
        }
        // 绘制设置了RGB的新图片
        graphics.drawImage(image, 0, 0, null);
        //释放画笔
        graphics.dispose();
    }
    /\*\*
     \* 设置指定图片透明
     \* @param sourcePath 源文件地址
     \* @param targetPath 新文件地址
     \*/
    public static void setColorInRange(String sourcePath,String targetPath ) {
        try {
            BufferedImage image = ImageIO.read(new File(sourcePath));
            // 高度和宽度
            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();
            // 绘制Image的图片
            g2D.drawImage(imageIcon.getImage(), 0, 0, null);
            // 图片透明
            setTransparency(bufferedImage, g2D);
            // 生成图片为PNG
            ImageIO.write(bufferedImage, FilenameUtils.getExtension(sourcePath), new File(targetPath));
        } catch (IOException e) {
            log.error("设置图片透明失败{}",e);
        }
    }
    /\*\*
     \* 判断是背景还是内容
     \* @param color
     \* @return
     \*/
    public static boolean colorInRange(int color) {
        // 色差范围0~255
        int colorRange = 210;
        // 获取color(RGB)中R位
        int red = (color & 0xff0000) >> 16;
        // 获取color(RGB)中G位
        int green = (color & 0x00ff00) >> 8;
        // 获取color(RGB)中B位
        int blue = (color & 0x0000ff);
        // 通过RGB三分量来判断当前颜色是否在指定的颜色区间内
        if (red >= colorRange && green >= colorRange && blue >= colorRange) {
            return true;
        }
        return false;
    }

以上就是Java 生成透明图片设置及实现示例,更多关于Java 生成透明图片的资料请关注码农之家其它相关文章!


参考资料

相关文章

  • java查询近七日数据功能的实现

    发布:2023-03-13

    这篇文章主要介绍了java查询近七日数据功能的实现,文章内容详细,简单易懂,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • Java 信息摘要加密MD2、MD4、MD5实例实现方法

    发布:2020-02-05

    这篇文章主要介绍了Java 信息摘要加密MD2、MD4、MD5实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下


  • 分享Java从Html文本中提取纯文本的方法

    发布:2020-02-12

    今天小编就为大家分享一篇Java实现从Html文本中提取纯文本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧


  • JavaScript DOM插入更新删除的基本操作

    发布:2020-02-12

    这篇文章主要为大家详细介绍了JavaScript之DOM插入更新删除,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • JAVA_HOME路径修改之后JDK的版本依然不更改的解决方案

    发布:2019-07-01

    今天小编就为大家分享一篇关于JAVA_HOME路径修改之后JDK的版本依然不更改的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧


  • Java编程实现高斯模糊和图像的空间卷积的实例讲解

    发布:2019-09-02

    这篇文章主要介绍了Java编程实现高斯模糊和图像的空间卷积详解,具有一定参考价值,需要的朋友可以了解下。


  • Java中LinkedList和ArrayList的效率分析

    发布:2023-04-06

    本文主要介绍了Java中LinkedList和ArrayList的效率分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • java反射获取一个object属性值的实例讲解

    发布:2021-05-20

    这篇文章主要介绍了java反射获取一个object属性值代码解析,具有一定借鉴价值,需要的朋友可以参考下。


网友讨论