我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java图片转字符图片的生成方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java图片转字符图片的生成方法

前面介绍了一篇java实现图片灰度化处理的小demo,接下来再介绍一个有意思的东西,将一个图片转换成字符图片

借助前面图片灰度化处理的知识点,若我们希望将一张图片转成字符图片,同样可以遍历每个像素点,然后将像素点由具体的字符来替换,从而实现字符化处理

基于上面这个思路,具体的实现就很清晰了


@Test
public void testRender() throws IOException {
    String file = "http://i0.download.fd.52shubiao.com/t_960x600/g1/M00/10/17/oYYBAFWvR5-IeXHuAAd5kPb8eSgAACm0QF50xIAB3mo414.jpg";
    // 从网络上下载图片
    BufferedImage img = ImageIO.read(FileReadUtil.getStreamByFileName(file));


    int w = img.getWidth(), h = img.getHeight();
    // 创建新的字符图片画板
    BufferedImage gray = new BufferedImage(w, h, img.getType());
    Graphics2D g2d = gray.createGraphics();
    g2d.setColor(null);
    g2d.fillRect(0, 0, w, h);

    Font font = new Font("宋体", Font.BOLD, 1);
    g2d.setFont(font);
    for (int x = 0; x < w; x ++) {
        for (int y = 0; y < h; y ++) {
   g2d.setColor(ColorUtil.int2color(img.getRGB(x, y)));
            g2d.drawString("灰", x, y);
        }
    }
    g2d.dispose();
    System.out.printf("渲染完成");
}

注意上面的实现,在会字符的时候,先取出源像素点的色彩,然后重新设置给g2d,这个int转color也比较简单,实现如下


public static Color int2color(int color) {
    int a = (0xff000000 & color) >>> 24;
    int r = (0x00ff0000 & color) >> 16;
    int g = (0x0000ff00 & color) >> 8;
    int b = (0x000000ff & color);
    return new Color(r, g, b, a);
}

这样就实现了一个基础版的转字符图了,实际跑一下看看效果

这下尴尬了,输出的并不是我们预期的字符图,那么问题出在哪呢?

仔细看上面的文字大小为1,文字太小,导致即使是有字符组件的图,最终肉眼看起来和原图也没啥区别

那么我们就试一下将这个文字搞大点,将n*n个像素点作为一个文字渲染区域,这样我们需要调整一下遍历的步长;其次就是这个区域的颜色怎么定

直接取均值



Color getAverage(BufferedImage image, int x, int y, int w, int h) {
    int red = 0;
    int green = 0;
    int blue = 0;

    int size = 0;
    for (int i = y; (i < h + y) && (i < image.getHeight()); i++) {
        for (int j = x; (j < w + x) && (j < image.getWidth()); j++) {
            int color = image.getRGB(j, i);
            red += ((color & 0xff0000) >> 16);
            green += ((color & 0xff00) >> 8);
            blue += (color & 0x0000ff);
            ++size;
        }
    }

    red = Math.round(red / (float) size);
    green = Math.round(green / (float) size);
    blue = Math.round(blue / (float) size);
    return new Color(red, green, blue);
}

另外的就是改一下遍历的步长


@Test
public void testRender() throws IOException {
    String file = "http://i0.download.fd.52shubiao.com/t_960x600/g1/M00/10/17/oYYBAFWvR5-IeXHuAAd5kPb8eSgAACm0QF50xIAB3mo414.jpg";
    // 从网络上下载图片
    BufferedImage img = ImageIO.read(FileReadUtil.getStreamByFileName(file));


    int w = img.getWidth(), h = img.getHeight();
    // 创建新的灰度图片画板
    BufferedImage gray = new BufferedImage(w, h, img.getType());
    Graphics2D g2d = gray.createGraphics();
    g2d.setColor(null);
    g2d.fillRect(0, 0, w, h);

    int size = 12;
    Font font = new Font("宋体", Font.BOLD, size);
    g2d.setFont(font);
    for (int x = 0; x < w; x += size) {
        for (int y = 0; y < h; y += size) {
            Color avgColor = getAverage(img, x, y, size, size);
            g2d.setColor(avgColor);
            g2d.drawString("灰", x, y);
        }
    }
    g2d.dispose();
    System.out.printf("渲染完成");
}

再次执行之后结果如下,实现了我们的预期效果

最后再介绍一个更好用的姿势,直接使用开源项目https://github.com/liuyueyi/quick-media 来实现图片字符画
使用这个项目的 image-plugins 之后,生成一个灰度图就很简单了


public void testCharImg() throws IOException {
    String img = "http://hbimg.b0.upaiyun.com/2b79e7e15883d8f8bbae0b1d1efd6cf2c0c1ed1b10753-cusHEA_fw236";
    BufferedImage out = ImgPixelWrapper.build().setSourceImg(img).setBlockSize(2)
            .setPixelType(PixelStyleEnum.CHAR_COLOR)
            .setChars("小灰灰blog")
            .build()
            .asBufferedImg();
    System.out.println(out);
}

注意这个ImgPixelWrapper封装类,处理基础的字符处理之外,还支持生成灰度图,gif图转字符动画,图片像素化(如马赛克...)

至于quick-media这个项目就更有意思了,java侧若想生成酷炫的二维码,选择它绝对不会让你失望;有兴趣的小伙伴可以瞅一瞅

到此这篇关于Java图片转字符图片的生成方法的文章就介绍到这了,更多相关Java图片转字符图片内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java图片转字符图片的生成方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python3:图片转字符画

防伪码:没有相当程度的孤独是不可能有内心的平和。1、环境准备主机名IP系统Python版本Python-01192.168.10.9CentOS release 6.9 (Final)3.5.4参考:https://www.shiyanlo
2023-01-31

java 生成文字图片的示例代码

本文主要介绍了java 生成文字图片的示例代码,分享给大家,具体如下:import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java
2023-05-31

PDF图片转换成文字的方法是什么

要将PDF中的图片转换为文字,可以使用OCR技术。OCR是光学字符识别的缩写,它可以将图片中的文字识别出来并转换为可编辑的文本。现在有很多OCR软件和在线工具可以使用,例如Adobe Acrobat、ABBYY FineReader、Goo
2023-06-06

java如何生成echarts图片

要在Java中生成ECharts图片,您可以使用ECharts官方提供的Java工具库echarts-java。以下是生成ECharts图片的基本步骤:1. 导入依赖:在您的Java项目中,添加echarts-java的依赖。```xmlc
2023-09-15

python3实现图片转字符画

用练习学习python3.#!/usr/bin/env python3#-*- coding:utf-8 -*-from PIL import Imageimport argparse'''argparse模块使得编写用户友好的命令行接口非
2023-01-31

Python 图片与字符串互转

#coding:utf-8# 引入base64库import base64# 把图片压缩成字符串with open("c:\\test.jpg", "rb") as imageFile:    image2str = base64.b64e
2023-01-31

用java把文字生成图片后放大失真,怎么才能生成高质量的图片

要生成高质量的图片,您可以尝试以下方法:1. 使用更高的分辨率:在生成图片时,设置更高的分辨率可以提高图像的质量。可以通过设置图像的宽度和高度来实现。2. 使用合适的图片格式:选择合适的图片格式也很重要。对于包含大量颜色和细节的图像,使用无
2023-09-08

基于Java生成图片验证码的方法解析

这篇文章主要来为大家详细介绍一下基于Java生成图片验证码的具体方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2023-02-06

java根据数据生成图片的方法是什么

在Java中,可以使用Java 2D图形库来生成图片。以下是生成图片的一种常见方法:1. 创建一个BufferedImage对象,该对象是一个可以在内存中进行绘图的图像缓冲区。```javaBufferedImage image = new
2023-09-17

php将图片的base64串 转成 图片文件

要将图片的base64串转成图片文件,可以使用以下代码:```php// 获取base64串$base64_string = '...'; // 替换成实际的base64串// 获取文件扩展名$matches = [];preg_match
2023-09-13

java生成PDF(图片,模板,表格)

刚接到了一个需求,生成一个pdf,一开始以为挺简单的,通过模板生成嘛,我也发过相应的文章,根据模板直接生成pdf,响应到前端或者根据模板生成pdf,直接指定下载位置,这两种方案都可以,不过这篇文章主要讲的生成的pdf是既有模板填充还需要自己
2023-08-16

利用jquery包将字符串生成二维码图片

将一个字符串生成二维码图片,如果想要带log的二维码,可以在生成后的二维码中间部位自己添加一个小log,具体实现如下,感兴趣的朋友可以参考下
2022-11-15

js把html转换成图片格式的方法

这篇文章主要介绍js把html转换成图片格式的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!js把html转换成图片格式的方法:首先利用html2canvas把html转换成canvas;然后利用canvas对象
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录