java 我爱你_java代码30行实现用我爱你重绘女朋友美照(我对你的爱,在每一个字里行间)...
闲言少许,我先上效果图。
左边是原图片,右边是文字替换的图片,是不是看出什么效果?我来放大一下!
这下能看到了吧,我对你的爱,在每一个字里行间哦~。有关程序员的强势浪漫。实现这个效果,代码非常简单,真实代码大约30行左右。
完整代码在文章最后!依旧是,程序虽然很少,但是并不简单下面是用到的 api
我们在代码中用到的类和方法。大家可以去上面链接学习一下哦
BufferedImage构造方法
getGraphics()
getWidth()
getHeight()
getType()
getRGB()
ImageIO:read()
write()
Graphics2DsetColor
drawString
我来依次讲解一下每行代码的作用。
首先先定义一个我们想要在图片中展示的内容
String base = "我爱你";
我们再读取我们想要转换的图片,这里呢,我们使用 ImageIO 中提供的静态方法 read(),传入一个文件,read() 方法回返回一个 BufferedImage 类型的图片缓存流。我们通过new File(path),来创建一个文件流。
BufferedImage image = ImageIO.read(new File(path));
我们再创建一个 BufferedImage 用于放置我们输出文字的图片。参数呢就是图片的宽度,图片的高度,和图片的类型。
BufferedImage newImage = new BufferedImage(image.getWidth(),image.getHeight(), image.getType());
创建一个2D坐标转换及绘图相关的类 Graphics2D,用来设置每个像素点的颜色、字体大小和字体样式。
Graphics2D graphics2d = (Graphics2D) newImage.getGraphics();
设置字体风格、样式和大小
graphics2d.setFont(new Font("宋体", Font.BOLD, 12));
下面就是写一个for循环,循环遍历每一个像素点,将每隔12个像素点就替换为文字。
index
for (int y = 0; y < image.getHeight(); y += 12) {
for (int x = 0; x < image.getWidth(); x += 12) {
//循环每一个像素点 }
}
for 循环中的的内容:获取图片当前位置像素的颜色
int pixel = image.getRGB(x, y);
for 循环中的的内容:分离出rgb三种颜色,分别进行灰度和二值化处理,想具体研究可以去找资料学习
int r = (pixel & 0xff0000) >> 16,
g = (pixel & 0xff00) >> 8,
b = pixel & 0xff;
for 循环中的的内容:通过graphics2d设置字体颜色
graphics2d.setColor(new Color(r, g, b));
for 循环中的的内容:在当前位置上绘上一个文字
graphics2d.drawString(String.valueOf(base.charAt(index % base.length)), x, y);
for 循环中的的内容:当前文字被绘上以后绘制下一个文字
index++;
最后,我们通过 ImageIO 方法,把图片重新绘制,并输出。
ImageIO.write(newImage, "JPG", new FileOutputStream("F:\\temp.jpg"));
在主方法中调用刚刚写的方法。
public static void main(final String[] args) {
FontImage.createAsciiPic("F:\\girl.jpg");
System.out.println("OK");
}
完整代码:
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
public class MyFontImage {
public static void createFongImg(String path){
String base = "我爱你";
try{
BufferedImage image = ImageIO.read(new File(path));
BufferedImage newImage = new BufferedImage(image.getWidth(),image.getHeight(),image.getType());
Graphics2D graphics2D = (Graphics2D) newImage.getGraphics();
graphics2D.setFont(new Font("宋体",Font.BOLD,12));
int index = 0;
for(int y = 0; y < image.getHeight(); y += 12){
for (int x = 0; x < image.getWidth(); x += 12){
int pxcolor = image.getRGB(x,y);
int r = (pxcolor & 0xff0000) >> 16,
g = (pxcolor & 0xff00) >> 8,
b = pxcolor & 0xff;
graphics2D.setColor(new Color(r, g, b));
graphics2D.drawString(String.valueOf(base.charAt(index % base.length())), x, y);
index++;
}
}
ImageIO.write(newImage, "JPG", new FileOutputStream("F:\\temp.jpg"));
}catch (Exception e){
e.printStackTrace();
}
};
public static void main(String args[]){
MyFontImage.createFongImg("F:\\girl.jpg");
System.out.println("OK");
}
}
喜欢的记得 点赞、关注 哦,不定期分享程序员的骚操作和强势浪漫!
附之前作品精选:
java 我爱你_java代码30行实现用我爱你重绘女朋友美照(我对你的爱,在每一个字里行间)...相关推荐
- 编程java 格式_Java代码的基本格式
Java中的程序代码都必须放在一个类中,初学者可以简单地把类理解为一个Java程序.类需要使用class关键字定义,在class前面可以有一些修饰符,格式如下:修饰符 class 类名 { 程序代码 ...
- vector java 复制_Java代码性能优化的 40+ 细节
点击上方"占小狼的博客",选择"设为星标" 来源:http://t.cn/EMze6kc 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本 ...
- 判断素数的java程序_Java代码实例 判断这个数是否是素数
import java.util.Scanner; /* 7.1:判断数字是否为素数(时间:20分钟) 7.1.1 任务描述 写一个程序,由用户输入一个整数,判断这个数是否是素数(素数:只能被1和本身 ...
- java微信支付代码_10行代码搞定微信支付(Java版)
原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...
- java代码优化_java代码之美(11)---java代码的优化
java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...
- java门槛_Java的入行门槛高吗?对学历有限制吗?
学习Java的热潮越来越高涨,除了转行而来的人,很多刚毕业的学生也加入到其中.很多人都觉得学习Java需要有一个高学历作为基础,一些专科生在学习之前会犹豫,他们是否能学习Java?学历会成为他们学习J ...
- 怎么运行java虚拟机_Java代码如何运行在Java虚拟机中
我们都知道要运行Java代码就必须要有JRE,也就是Java运行时环境,JRE中包含了Java程序的必需组件,包括Java虚拟机以及Java核心类库,然而运行C++代码则不需要额外的运行时环境,只需要 ...
- java代_java代码
展开全部 自己写着玩的,很简单,你试一试哦... 主要用了javax.swing.Timer这个类62616964757a686964616fe58685e5aeb931333363396463: i ...
- java 魔法值_Java代码中的魔法值
所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义. 1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String ...
最新文章
- Python执行系统命令的四种方法
- em算法 实例 正态分布_【机器学习】EM算法详细推导和讲解
- 计算机组成原理简单计算机设计,计算机组成原理课设.doc
- 马踏棋盘python_马踏棋盘python实现
- 第7篇 WPF C# 怎样定义类及其接口
- AndroidStudio安卓原生开发_Activity的启动模式部分singleTop启动模式和singleTask启动模式---Android原生开发工作笔记87
- python输入圆的半径公式_【公布答案(【输入输出】练习题:Hello, C++)】
- 五年级上册用计算机探索规律思维导图,五年级上册数学第一单元思维导图 包括小数乘整数小数乘小数积的...
- 条件概率分布、联合概率分布和边缘概率分布
- linux内存速度测试命令dd,Linux 中用 dd 命令来测试硬盘读写速度
- Android Binder机制
- Android Studio实现用户登陆界面demo(xml实现)
- 设备巡检的执行的痛点及解决方案
- textureview 缩放_TextureView实现视频播放详解
- 强烈推荐这些值得下载的神仙工具,每一个都让人惊喜
- ce修改植物大战僵尸阳光
- 基于CentOS7.6系统搭建远程GIT服务器
- vue项目运行后,生成的两个地址Local和Network的区别
- JavaScript项目案例
- 文献管理与信息分析(2018年秋 第九次开课)第三次课程小结
热门文章
- java unicode 转换_java中unicode和中文相互转换的简单实现
- Bullet3-2.87在Ubuntu16.04下源码编译安装
- 自己动手制作u盘启动盘,借助UltraISO就行了
- Libra天平币项目机制原理与节点功能测试
- 虚拟服务器网络延时大,解决Hyper-V内虚拟机网络延迟高的问题(ping延时大)
- 概率与计算机论文,概率归纳逻辑分析论文
- 2021固始高中高考成绩查询,2021年固始县高考状元名单资料,今年固始县高考状元多少分...
- windows7 + Qt(MSVC2017) + VS2019安装配置
- 升序排序,奇数在偶数之前
- 【解决RIDE出现中文乱码的问题】