闲言少许,我先上效果图。

左边是原图片,右边是文字替换的图片,是不是看出什么效果?我来放大一下!

这下能看到了吧,我对你的爱,在每一个字里行间哦~。有关程序员的强势浪漫。实现这个效果,代码非常简单,真实代码大约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行实现用我爱你重绘女朋友美照(我对你的爱,在每一个字里行间)...相关推荐

  1. 编程java 格式_Java代码的基本格式

    Java中的程序代码都必须放在一个类中,初学者可以简单地把类理解为一个Java程序.类需要使用class关键字定义,在class前面可以有一些修饰符,格式如下:修饰符 class 类名 { 程序代码 ...

  2. vector java 复制_Java代码性能优化的 40+ 细节

    点击上方"占小狼的博客",选择"设为星标" 来源:http://t.cn/EMze6kc 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本 ...

  3. 判断素数的java程序_Java代码实例 判断这个数是否是素数

    import java.util.Scanner; /* 7.1:判断数字是否为素数(时间:20分钟) 7.1.1 任务描述 写一个程序,由用户输入一个整数,判断这个数是否是素数(素数:只能被1和本身 ...

  4. java微信支付代码_10行代码搞定微信支付(Java版)

    原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...

  5. java代码优化_java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...

  6. java门槛_Java的入行门槛高吗?对学历有限制吗?

    学习Java的热潮越来越高涨,除了转行而来的人,很多刚毕业的学生也加入到其中.很多人都觉得学习Java需要有一个高学历作为基础,一些专科生在学习之前会犹豫,他们是否能学习Java?学历会成为他们学习J ...

  7. 怎么运行java虚拟机_Java代码如何运行在Java虚拟机中

    我们都知道要运行Java代码就必须要有JRE,也就是Java运行时环境,JRE中包含了Java程序的必需组件,包括Java虚拟机以及Java核心类库,然而运行C++代码则不需要额外的运行时环境,只需要 ...

  8. java代_java代码

    展开全部 自己写着玩的,很简单,你试一试哦... 主要用了javax.swing.Timer这个类62616964757a686964616fe58685e5aeb931333363396463: i ...

  9. java 魔法值_Java代码中的魔法值

    所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义. 1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String ...

最新文章

  1. Python执行系统命令的四种方法
  2. em算法 实例 正态分布_【机器学习】EM算法详细推导和讲解
  3. 计算机组成原理简单计算机设计,计算机组成原理课设.doc
  4. 马踏棋盘python_马踏棋盘python实现
  5. 第7篇 WPF C# 怎样定义类及其接口
  6. AndroidStudio安卓原生开发_Activity的启动模式部分singleTop启动模式和singleTask启动模式---Android原生开发工作笔记87
  7. python输入圆的半径公式_【公布答案(【输入输出】练习题:Hello, C++)】
  8. 五年级上册用计算机探索规律思维导图,五年级上册数学第一单元思维导图 包括小数乘整数小数乘小数积的...
  9. 条件概率分布、联合概率分布和边缘概率分布
  10. linux内存速度测试命令dd,Linux 中用 dd 命令来测试硬盘读写速度
  11. Android Binder机制
  12. Android Studio实现用户登陆界面demo(xml实现)
  13. 设备巡检的执行的痛点及解决方案
  14. textureview 缩放_TextureView实现视频播放详解
  15. 强烈推荐这些值得下载的神仙工具,每一个都让人惊喜
  16. ce修改植物大战僵尸阳光
  17. 基于CentOS7.6系统搭建远程GIT服务器
  18. vue项目运行后,生成的两个地址Local和Network的区别
  19. JavaScript项目案例
  20. 文献管理与信息分析(2018年秋 第九次开课)第三次课程小结

热门文章

  1. java unicode 转换_java中unicode和中文相互转换的简单实现
  2. Bullet3-2.87在Ubuntu16.04下源码编译安装
  3. 自己动手制作u盘启动盘,借助UltraISO就行了
  4. Libra天平币项目机制原理与节点功能测试
  5. 虚拟服务器网络延时大,解决Hyper-V内虚拟机网络延迟高的问题(ping延时大)
  6. 概率与计算机论文,概率归纳逻辑分析论文
  7. 2021固始高中高考成绩查询,2021年固始县高考状元名单资料,今年固始县高考状元多少分...
  8. windows7 + Qt(MSVC2017) + VS2019安装配置
  9. 升序排序,奇数在偶数之前
  10. 【解决RIDE出现中文乱码的问题】