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个像素点作为一个文字渲染区域,这样我们需要调整一下遍历的步长;其次就是这个区域的颜色怎么定

直接取均值

/**
 * 求取多个颜色的平均值
 *
 * @return
 */
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图片转字符图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java实现解析二进制文件的方法(字符串、图片)

    1.需求说明,实现细节要求: 解析二进制文件 files\case10\binary,其中包含一个字符串和一张图片,数据文件格式为字符串数据长度(2字节)+字符串内容+图片数据长度(4字节)+图片数据,数据长度均为数据字节长度,高位在后,字符串为UTF-8编码,请解析,输出字符串内容,图片文件保存为files\case10\test.png. 2.实现代码: package com.igen.case10; import java.io.File; import java.io.FileInpu

  • Java利用opencv实现用字符展示视频或图片的方法

    背景:前段时间看到有人将图片转成符号,感觉挺有意思的,就结合了一下opencv. 代码如下: package org.fxd.utils; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; import org.opencv.videoio.VideoCapture; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import

  • 使用Java打印数字组成的魔方阵及字符组成的钻石图形

    打印魔方阵 输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素.  N=3时: 1 2 3 8 9 4 7 6 5 [输入形式] 从标准输入读取一个整数N.  [输出形式] 向标准输出打印结果.输出符合要求的方阵,每个数字占5个字符宽度,向右对齐,在每一行末均输出一个回车符. [输入样例]  4 [输出样例] 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 实现: package cn.

  • java实现图像转码为字符画的方法

    本文实例为大家分享了java实现图像转码为字符画的具体代码,供大家参考,具体内容如下 public class ImageProcesser { private static final char[] charset1 = {'M','8','V','|',':','.',' '}; //默认字符素材集 private char[] charset; //字符画素材集 private String imgString = ""; //储存转化后的字符串 //使用指定字符集构造 publ

  • 三张图彻底了解Java中字符串的不变性

    该文章是图说Java系列文章中的一篇 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用". 使用变量来赋值变量 String s2 = s; s2保存了相同的引用值,因为他们代表同一个对象. 字符串连接 s = s.concat("ef"); s中保存的是一个重新创建出来的string对象的引用. 总结 一旦一个string对象在内存(堆)中被创建出来,他就无法被修改.特别

  • java实现图片转ascii字符画的方法示例

    最近抖音上挺火的一个小把戏,在记事本打开,一整篇的乱码字符,然后进过调整之后,出现一张由各种字符组成的黑白照片.先看一个效果图 效果如下: 实现原理: 将图片分解为像素点然后计算出每个点的灰度值,根据不同的灰度用不同的字符填充. 具体代码: package com.dongge; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.Im

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

    前面介绍了一篇java实现图片灰度化处理的小demo,接下来再介绍一个有意思的东西,将一个图片转换成字符图片 借助前面图片灰度化处理的知识点,若我们希望将一张图片转成字符图片,同样可以遍历每个像素点,然后将像素点由具体的字符来替换,从而实现字符化处理 基于上面这个思路,具体的实现就很清晰了 @Test public void testRender() throws IOException { String file = "http://i0.download.fd.52shubiao.com/t

  • python如何将图片转换为字符图片

    简介 一个简单的python程序,将图片转换为字符图片. (为了简便,很多参数写死了,自己看着改吧. (←∀←)) 正文 原图(侵删) 结果图 源码 [更多细节]-->戳这里 #-*- coding: UTF-8 -*- from PIL import Image from PIL import ImageDraw from PIL import ImageFont import matplotlib.pyplot as plt import numpy as np import time de

  • Python将图片转换为字符画的方法

    最近在学习Python,看到网上用Python将图片转换成字符画便来学习一下 题目意思是,程序读入一个图片,以txt格式输出图片对应的字符画,如图所示: 以下是Python代码: # coding:utf-8 # 为一张图片生成对应的字符集图片 from PIL import Image import argparse # 命令行输入参数处理 parser = argparse.ArgumentParser() parser.add_argument('file') # 输入文件 parser.

  • python Opencv将图片转为字符画

    做了个Python的小练习,网上有人是利用PIL中的Image来实现的,觉得Opencv库挺方便的,于是利用Opencv库来实现了一下,代码如下: # -*- coding: utf-8 -*- # feimengjuan # 实现将图片转为字符画 import cv2 ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") #

  • 25行Java代码将普通图片转换为字符画图片和文本的实现

    本文主要介绍了25行Java代码将普通图片转换为字符画图片和文本的实现,分享给大家,具体如下: 原图 生成字符画文本(像素转换字符显示后,打开字符画显示相当于原图的好几倍大,不要用记事本打开,建议用notepad++等软件打开) 生成字符画图片(背景颜色和画笔颜色代码里可设置调节) 新建普通java 项目,Java单类实现代码,复制到java项目中,用idea编辑器 主方法运行.(引入的Class 都是JDK中自有的) import javax.imageio.ImageIO; import j

  • java实现随机验证码图片生成

    本文实例为大家分享了java生成随机验证码图片的具体代码,供大家参考,具体内容如下 1.controller /** * 获取随机数验证码图片 * * @param request HttpServletRequest * @param response HttpServletResponse */ @GetMapping(value = "/getRandomCode" ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) pub

  • java web中图片验证码功能的简单实现方法

    用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

  • yii实现图片上传及缩略图生成的方法

    本文实例讲述了利用yii框架来实现图片上传功能并在上传成功之后自动生成缩略图的方法,分享给大家供大家参考.具体实现方法如下: Action文件: 复制代码 代码如下: <?php /**  * TestController.php  * Created on: 2014-1-26 12:59:36 by Outsider  */ class TestController extends CController {       /**      * 缩略图片生成      * @ path 图片路

  • java中pdf转图片的实现方法

    JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用. 一.icepdf.有收费版和开源版,几种方法里最推荐的.转换的效果比较好,能识别我手头文件中的中文,就是转换后可能字体的关系部分字间距有点宽.因为,字体支持是要收费的,所以转换的图片会带有官方的水印.去水印的方法可以查看另一篇文章:icepdf去水印方法 1.下载icepdf的架包,并导入项目中,这里用到4个,如下: 2.附上代码例子: String filePath = "c:/test.pdf

  • Java实现的不同图片居中剪裁生成同一尺寸缩略图功能示例

    本文实例讲述了Java实现的不同图片居中剪裁生成同一尺寸缩略图功能.分享给大家供大家参考,具体如下: 因为业务需要,写了这样一个简单类,希望能帮助对有这方面需要的人,高手莫笑 源码如下: package platform.edu.resource.utils; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import

随机推荐