java 实现图片圆角处理、背景透明化

目录
  • java 图片圆角处理、背景透明化
  • java 的图片处理解析

java 图片圆角处理、背景透明化

/**图片圆角处理,背景透明化
     * @param srcImageFile 原图片
     * @param result  处理后图片
     * @param type   图片格式
     * @param cornerRadius  720为圆角
     */
    public  void makeRoundedCorner(File srcImageFile, File result, String type, int cornerRadius) {
        try {
            BufferedImage bi1 = ImageIO.read(srcImageFile);

            // 根据需要是否使用 BufferedImage.TYPE_INT_ARGB
            BufferedImage image = new BufferedImage(bi1.getWidth(), bi1.getHeight(),
                    BufferedImage.TYPE_INT_ARGB);

            Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, bi1.getWidth(), bi1
                    .getHeight());

            Graphics2D g2 = image.createGraphics();
            image = g2.getDeviceConfiguration().createCompatibleImage(bi1.getWidth(), bi1.getHeight(), Transparency.TRANSLUCENT);
            g2 = image.createGraphics();
            g2.setComposite(AlphaComposite.Clear);
            g2.fill(new Rectangle(image.getWidth(), image.getHeight()));
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f));
            g2.setClip(shape);
            // 使用 setRenderingHint 设置抗锯齿
            g2 = image.createGraphics();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.fillRoundRect(0, 0,bi1.getWidth(), bi1.getHeight(), cornerRadius, cornerRadius);
            g2.setComposite(AlphaComposite.SrcIn);
            g2.drawImage(bi1, 0, 0, bi1.getWidth(), bi1.getHeight(), null);
            g2.dispose();
            ImageIO.write(image, type, result);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

java 的图片处理解析

直接上效果图,现在有的需求就是把用户的头像,跟昵称嵌入到这个背景图中。

第一步,把头像切成圆角,背景透明的图片。

第二部,把第一步生成的图片,当成水印放到坐标的左边的红箭头的地方

第三部,创建文字水印,然后放入到右边的红箭头地方。

效果图如下:

由于需要thumbnailator组件支持

先导入maven

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>

直接上代码:

package com.image;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Transparency;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Position;
public class ImageDo {
public static void main(String[] args) throws IOException {
//首先获取
makeRoundedCorner("C:/Users/luojie/Desktop/0.jpg", "C:/Users/luojie/Desktop/2.png", "png", 170);
//后续水印在背景图片的的x轴y轴的坐标
Position ab=  new Position() {
@Override
public Point calculate(int enclosingWidth, int enclosingHeight, int width, int height, int insetLeft,
int insetRight, int insetTop, int insetBottom) {
// TODO Auto-generated method stub
return new Point(89, 53);
}
};
//把生成的圆形图片变换成宽高142x142的图片
Thumbnails.of("C:/Users/luojie/Desktop/2.png").size(142, 142).toFile(
"C:/Users/luojie/Desktop/2_142x142.png");
//把生成的圆形图片,当水印贴到背景图中,ab为圆形图片应该到背景图的x轴y轴的坐标
Thumbnails.of("C:/Users/luojie/Desktop/cmbg.png").size(1280, 1024).watermark(ab,
ImageIO.read(new File("C:/Users/luojie/Desktop/2_142x142.png")), 1f)
.outputQuality(0.8f).toFile("C:/Users/luojie/Desktop/image_watermark_bottom_right.jpg");
//给文字水印
pressText("C:/Users/luojie/Desktop/image_watermark_bottom_right.jpg", "WEIXINYONGHU", "Comic Sans MS", Font.BOLD, 30, Color.BLACK,275, 65, 1f);
}
    /**
     * 添加文字水印
     * @param targetImg 目标图片路径,如:C://myPictrue//1.jpg
     * @param pressText 水印文字, 如:中国证券网
     * @param fontName 字体名称,    如:宋体
     * @param fontStyle 字体样式,如:粗体和斜体(Font.BOLD|Font.ITALIC)
     * @param fontSize 字体大小,单位为像素
     * @param color 字体颜色
     * @param x 水印文字距离目标图片左侧的偏移量,如果x<0, 则在正中间
     * @param y 水印文字距离目标图片上侧的偏移量,如果y<0, 则在正中间
     * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)
     */
    public static void pressText(String targetImg,String pressText,String fontName,int fontStyle,int fontSize,Color color,int x,int y,float alpha){
        try {
            File file = new File(targetImg);
            Image image = ImageIO.read(file);
            int width = image.getWidth(null);
            int height = image.getHeight(null);  

            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufferedImage.createGraphics();
            g.drawImage(image,0,0, width, height, null);
            g.setFont(new Font(fontName, fontStyle, fontSize));
            g.setColor(color);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));  

            int width_wi = fontSize*getTextLength(pressText);
            int height_wi = fontSize;
            int widthDiff = width-width_wi;
            int heightDiff = height-height_wi;
            if(x<0){
                x = widthDiff/2;
            }else if(x>widthDiff){
                x=widthDiff;
            }  

            if(y<0){
                y = heightDiff/2;
            }else if(y>heightDiff){
                y = heightDiff;
            }
            g.drawString(pressText, x, y+height_wi);//水印文件
            g.dispose();
            ImageIO.write(bufferedImage, "JPEG", file);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }      

    /**
     * 计算文字像素长度
     * @param text
     * @return
     */
    private static int getTextLength(String text){
        int textLength = text.length();
        int length = textLength;
        for (int i = 0; i < textLength; i++) {
            int wordLength = String.valueOf(text.charAt(i)).getBytes().length;
            if(wordLength > 1){
                length+=(wordLength-1);
            }
        }
        return length%2==0 ? length/2:length/2+1;
    }
/*
* 圆角处理
* @param BufferedImage
* @param cornerRadius
* */
public static String makeRoundedCorner(String srcImageFile, String result, String type, int cornerRadius) {
   try {
       BufferedImage image = ImageIO.read(new File(srcImageFile));
//        int w = image.getWidth();
//        int h = image.getHeight();
       int w = image.getWidth();
       int h = image.getHeight();
       BufferedImage output = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
       Graphics2D g2 = output.createGraphics();

       output = g2.getDeviceConfiguration().createCompatibleImage(w, h, Transparency.TRANSLUCENT);
       g2.dispose();
       g2 = output.createGraphics();
       //这里绘画圆角矩形
//        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//        g2.fillRoundRect(0, 0,w, h, cornerRadius, cornerRadius);
//        g2.setComposite(AlphaComposite.SrcIn);

       //这里绘画原型图
       Ellipse2D.Double shape = new Ellipse2D.Double(0, 0,w, h);
       g2.setClip(shape);  

       g2.drawImage(image, 0, 0, w, h, null);
       g2.dispose();
       ImageIO.write(output, type, new File(result));
       return result;
   } catch (IOException e) {
       e.printStackTrace();
   }
   return null;
}
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决java压缩图片透明背景变黑色的问题

    复制代码 代码如下: public class Picture {          // TODO Auto-generated constructor stub       public static void resizePNG(String fromFile, String toFile, int outputWidth, int outputHeight,boolean proportion) {              try {                 File f2 =

  • java如何去除图片中的白色背景

    最近在做一个需求是从数据库里面取出图片,但是图片都有一个白色的背景,于是项目组希望可以将图片的白色的背景去掉. 本文为大家分享了java去除图片中的白色背景的方法,供大家参考,具体内容如下 如图所示: 当然在这个上面是看不出来的,其实第一张图片是有一个白色的背景的,但是第二张图片没有,相信你理解我说的,那么这个代码我应该如何实现: package com.wdg.util; import java.awt.Graphics2D; import java.awt.Image; import jav

  • java处理图片背景颜色的方法

    今天老师想让我帮忙把她们200多张寸照换成白底的,这些寸照里面多为蓝色底,红色底. 用ps?不!用java!! 对,我第一反应就是用java,到网上找到了一个获得图片像素的源码.动手改了下,就编出来了,200多张照片的处理就用了半分钟. /** * 功能: * 将蓝底寸照批量转换为白底 * 主要是可以几百张,几千张地处理 * @author 赵俊夫 * */ public class ImageColorDemo { public static void main(String args[])

  • java 实现图片圆角处理、背景透明化

    目录 java 图片圆角处理.背景透明化 java 的图片处理解析 java 图片圆角处理.背景透明化 /**图片圆角处理,背景透明化 * @param srcImageFile 原图片 * @param result 处理后图片 * @param type 图片格式 * @param cornerRadius 720为圆角 */ public void makeRoundedCorner(File srcImageFile, File result, String type, int corn

  • Java Swing实现窗体添加背景图片的2种方法详解

    本文实例讲述了Java Swing实现窗体添加背景图片的2种方法.分享给大家供大家参考,具体如下: 在美化程序时,常常需要在窗体上添加背景图片.通过搜索和测试,发现了2种有效方式.下面分别介绍. 1. 利用JLabel加载图片 利用JLabel自带的setIcon(Icon icon)加载icon,并设置JLabel对象的位置和大小使其完全覆盖窗体.这是一个很取巧的办法,代码非常简单,如下所示. JLabel lbBg = new JLabel(imageIcon); lbBg.setBound

  • Java操作透明图片并保持背景透明的实现

    目录 Java操作透明图片并保持背景透明 Java图片背景透明及透明度处理 Java操作透明图片并保持背景透明 最近的一个需求,需要对背景为透明的图片加汉字,加完后会出现背景变黑的情况,附上解决方案 public static void pressText2(String sourceImg,String targetImg) { try { File file = new File(sourceImg); File targetfile = new File(targetImg); Image

  • Java实现图片合成的示例详解

    目录 场景 环境 搭建 引入pom文件 定义核心接口ImageService 定义核心接口实现类ImageServiceImpl 测试ImageController 测试效果 总结 场景 前端有一个神器——canvas,这个画布标签可以处理各种图片的合成,可以精确到图片的具体坐标,加水印,去水印,简直不要太简单!那java后端可以处理吗?请大声的告诉他,能,必须能!今天小编告诉你一个神器——image-combiner,合成图片so easy! 环境 jdk1.8 spring boot 搭建

  • android实现圆角矩形背景的方法

    本文实例讲述了android实现圆角矩形背景的方法.分享给大家供大家参考.具体如下: 1. java代码如下: import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.

  • Java 实现图片压缩的两种方法

    问题背景. 典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示. 如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了. 用户上传的原图可能由于清晰度较高而体积也相对较大,考虑用户流量带宽,一般而言我们都不会直接体积巨大的原图直接丢给用户让用户慢慢下载. 这时候通常我们会在服务器对图片进行压缩,然后把压缩后的图片内容回显给用户. 压缩方案: 这里主要找了两个java中常用的图片压缩工具库:Graphics和Thumbnailator. 1.Graphic

  • java实现图片验证码

    本文实例为大家分享了java实现图片验证码的具体代码,供大家参考,具体内容如下 目的: 1) 验证操作者是否是人 2) 防止表单重复提交 生成验证码的要点: 1) 使用java代码生成图片对象 BufferedImage 2) 使用Random生成随机字符串 3) 将图片对象用 ImageIO.write(图片对象, "jpeg|png", 响应字节输出流)返回给客户端浏览器 验证验证码: 要点: 1) 将验证码文字存入session作用域 2) 表单提交时,对比session中的验证

  • Java实现图片上传到服务器并把上传的图片读取出来

    在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢? 下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的不太清楚) 实现的思路: 工具:MySQL,eclipse 首先,在MySQL中创建了两个表,一个t_user表,用来存放用户名,密码等个人信息, 一个t_touxiang表,用来存放上传的图片在服务器中的存放路径,以及图片名字和用户ID, T_touxiang表中的用户ID对应了t_user中的i

  • java实现图片裁切的工具类实例

    本文实例讲述了java实现图片裁切的工具类.分享给大家供大家参考,具体如下: package com.yanek.util; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import javax.im

  • java将图片分割为几个部分示例

    以下代码使用java将图片分割为几个部分,大家参考使用吧 复制代码 代码如下: public class SegmentationImage{ public static Icon Segmentation(String imagename,int Width,int Height,int height,int width) throws Exception{  // 准备分割图片 BufferedImage img1=ImageIO.read(new File(imagename));   

随机推荐