首先, 其实应该把标题改为——给任意图片右上角套上红色消息数目框;

代码如下:

//主程序:

package cn.sourcecodes.main;

import cn.sourcecodes.utils.DecorationUtil;

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Scanner;

/**

* Created by cn.sourcecodes on 2016/11/26.

*/

public class DecoratePicture {

public static final String OUTPUT_DIRECTORY = "d://decoratedPictures/";

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

//如果输出文件夹不存在, 创建它

File dir = new File(DecoratePicture.OUTPUT_DIRECTORY);

if(!dir.exists()) {

System.out.println("not exist");

dir.mkdir();

}

boolean isQuit = false;

while(!isQuit) {

String inputPath;

String messageNum;

System.out.println("请输入文件路径如(d://test/test.jpg, 开头盘符后必须接 // 否则生成文件文件名不规范)");

inputPath = input.nextLine();

System.out.println("请输入消息数: ");

messageNum = input.nextLine();

File file = new File(inputPath);

try {

BufferedImage sourceImage = ImageIO.read(file);

DecorationUtil.getAfterCombine(Integer.valueOf(messageNum), sourceImage);

String outputPath = DecoratePicture.OUTPUT_DIRECTORY + "decorated_" + getFileName(inputPath);//输出文件路径

OutputStream output = new FileOutputStream(outputPath);

String format = getFileName(inputPath).split("\\.")[1]; //获取文件格式名, 比如 jpg

ImageIO.write(sourceImage, format, output);

output.close();

System.out.println("quit 退出, 任意字符继续");

String action = input.nextLine();

if(action.equals("quit")) {

isQuit = true;

}

} catch (IOException e) {

System.out.println("文件不存在");

} catch (NumberFormatException e) {

System.out.println("输入的不是数字");

} catch (Exception e) {

System.out.println("未知异常");

}

}

}

//获取传入文件的文件名

public static String getFileName(String path) {

String temp = path.substring(4); //去掉前面盘符, 如: d://

//分割获取最后一个,就是文件名

String[] splitTemp = temp.split("/");

String fileName = splitTemp[splitTemp.length-1];

return fileName;

}

}

//工具类 package cn.sourcecodes.utils;

import java.awt.*;

import java.awt.font.FontRenderContext;

import java.awt.geom.Ellipse2D;

import java.awt.geom.Rectangle2D;

import java.awt.image.BufferedImage;

/**

* Created by cn.sourcecodes on 2016/11/26.

*/

public class DecorationUtil {

public static void getAfterCombine(int messageNum, BufferedImage bufferedImage) {

int pictureWidth = bufferedImage.getWidth();

int pictureHeight = bufferedImage.getHeight();

Graphics2D graphics2D = bufferedImage.createGraphics();

BufferedImage messageImage = getMessageCircle(messageNum, pictureWidth, pictureHeight);

int diameter;

//消息圆圈直径为宽或者高的 1/3

if(pictureWidth < pictureHeight) {

diameter = pictureWidth / 3;

} else {

diameter = pictureHeight / 3;

}

int hideSize = diameter / 20; //右边和上边隐藏的像素

graphics2D.drawImage(messageImage, null, (pictureWidth + hideSize - diameter), -hideSize);

}

//圆框的bufferedImage, 需要传入显示的消息数, 原图片宽高

public static BufferedImage getMessageCircle(int messageNum, int pictureWidth, int pictureHeight) {

String numberStr;

if(messageNum > 99) {

numberStr = "99+";

} else if(messageNum < 0) {

numberStr = "0";

} else {

numberStr = String.valueOf(messageNum);

}

int diameter;

//消息圆圈直径为宽或者高的 1/3

if(pictureWidth < pictureHeight) {

diameter = pictureWidth / 3;

} else {

diameter = pictureHeight / 3;

}

//这样构造的bufferedImage背景是黑色的

BufferedImage bufferedImage = new BufferedImage(diameter, diameter, BufferedImage.TYPE_3BYTE_BGR);

Graphics2D g2d = bufferedImage.createGraphics();

//背景透明的bufferedImage

bufferedImage = g2d.getDeviceConfiguration().createCompatibleImage(diameter, diameter, Transparency.TRANSLUCENT);

g2d.dispose();//释放

//下面开始画消息框

Graphics2D graphics2D = bufferedImage.createGraphics();

//先画红色圆圈

graphics2D.setPaint(Color.RED);

Ellipse2D ellipse = new Ellipse2D.Double(0, 0, diameter, diameter);

graphics2D.fill(ellipse);

//画消息, 消息要画在正中间

int fontSize = diameter / 2; //字体大小为直径 2/6

Font font = new Font("SansSerif", Font.PLAIN, fontSize);

graphics2D.setFont(font);

//获取包含字符串 numberStr 的矩形, 通过它来获取字符串占的宽高

FontRenderContext context = graphics2D.getFontRenderContext();

Rectangle2D bounds = font.getStringBounds(numberStr, context);

double x = (diameter - bounds.getWidth()) / 2;

double y = (diameter - bounds.getHeight()) / 2;

double acsent = -bounds.getY(); //上坡度;

double baseY = y + acsent;

//画消息

graphics2D.setPaint(Color.WHITE);

graphics2D.drawString(numberStr, (int)x, (int)baseY);

graphics2D.dispose();

return bufferedImage;

}

}

java头像_用java实现给你的头像) +n相关推荐

  1. 易语言 java支持_开源Java客户端可以连接易语言服务器

    我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后, 都要先跟当前的客户端通信完之后才能再处理下一个连接请求. 这在并发比较多的情况下会严重影响程序的性能, 为此,我们可 ...

  2. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...

    最近逛知乎,发现有很多想自学 Java 或者 Java 初学者提问,不知道如何学习 Java?我接触 Java 快 8 年的时间了,一直从事 Java 开发工作,自己一直升级打怪,对于如何更好的学习 ...

  3. java海报_使用java画一张海报

    PS: 没找到合适的海报背景,就随便找了一张,使用技术都是相同的 1. 添加依赖 这俩其实跟本章节的核心技术没有关系,是为了获取QQ昵称和QQ头像而引入的. org.jsoup jsoup 1.11. ...

  4. java 模板方法_设计模式(java实现)_模板方法模式(Template method)

    设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...

  5. java安装_使用Java 9模块化来发布零依赖本机应用程序

    java安装 为什么我不能仅构建一个.EXE? 首次引入Java时,主流编程语言大多要么编译成独立的可执行文件(例如C / C ++,COBOL),要么在解释器中运行(例如Perl,Tcl). 对于许 ...

  6. java转账_使用Java模拟银行账户存、取款、转账功能

    半枯 package bank;import java.util.Scanner;/** * 1.建立一个银行账户类(Acount),具有建立新帐号.查询余额.存款.取款.转账 * 即从本账户把钱转给 ...

  7. java预期_预期. java的

    我有这段java代码.我是java中的菜鸟.. 错误: expected cfg = new Config; 码: import java.sql.Connection; import java.sq ...

  8. python能解密java的_实现Java加密,Python解密的RSA非对称加密算法功能

    摘要 因为最近业务需要使用到openssl的rsa非对称加密算法,研究了下它的使用方式,但是特殊在于前端分IOS和android两端,所以前端部门要求使用java给他们做一个加密工具包,但是因为服务端 ...

  9. java书籍_学习Java最好的10本书,从入门到精通

    在当代,学习Java等编程课程的主要方式是视频资源,如果你想学,在网上五分钟之内就可以找到一堆学习视频,瞬间将你的硬盘填满.但是这些课程质量良莠不齐,对于小白来说很难辨别好坏. 但是书籍不同,书籍都是 ...

最新文章

  1. opencv-python视频处理之图片变成视频,视频切成图片
  2. PL/SQL -- 动态SQL
  3. Ubuntu14-04安装redis和php5-redis扩展
  4. Android焦点问题
  5. 【转】foreach for each for_each引发的探讨:c++世界中的循环语句
  6. 操作无法完成因为已经在mysqld.exe上打开_金蝶KIS软件操作技巧/百问百答(下)...
  7. 分组求和计算_excel聚合、累计、分组累计、分组聚合函数
  8. MFC开发IM-第二十八篇、acl 的编译与使用
  9. 区间DP--凸多边形三角剖分
  10. jdk版本修改不生效
  11. UIButton 文字图片排列
  12. java layout各布局_java-Layout(布局管理器)
  13. wps html嵌入ppt,wps文档怎么插入打开幻灯片 WPS文字添加ppt幻灯片教程
  14. cf虚拟服务器设置方法,CF和GA免费顶级域名申请注册及修改DNS域名解析方法
  15. 关于Windows分盘的操作
  16. python国际象棋规则_如何使用Python编写一个国际象棋AI程序
  17. 互联网晚报 | 7月17日 星期日 | iPhone 14量产在即;首款国产科学计算软件研发成功;上半年广东人均收入2.47万元...
  18. bat脚本:Windows批处理
  19. zabbix配置钉钉报警
  20. Motan服务的启动

热门文章

  1. Linux基线安全加固操作实践
  2. os系统共享的 不显示计算机,Windows与Mac OS共享文件-windows无法访问指定设备路径或文件...
  3. 【ENOVIA】xCAD协同数据管理-Solid Edge | 达索系统百世慧®
  4. win11玩绝地求生闪退怎么办 windows11玩绝地求生闪退的解决方法
  5. 《这些道理没有人告诉过你》_阅读笔记
  6. 医学高材生们,思维导图给你4个高效学习技巧
  7. 利用批处理文件bat自动删除和压缩文件
  8. 一张图弄懂汇编程序常用指令系统(知识结构图)--快速参照手册(参照:人民邮电出版社《汇编语言程序设计(第二版)》前5章内容)
  9. Flac3D常用命令部分
  10. java串口调试助手开发记录