很久都没有更新博客了,昨天下午一个朋友问我能不能将一张图片转换成字符画,然后我想我这个朋友不知道,也许有的朋友以不知道,我就简单的分享一下

package com.xsl.zhuanhuan;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.Buffer;

import javax.imageio.ImageIO;
/***
 * 图片转换为字符
 * @author Administrator
 */
public class ImgChar {
   public static void main(String[] args) throws Exception {
    //获取图片路径
   String path="F:/image/1.jpg";
   //将path放入缓冲区
   File file=new File(path);
   //放到缓冲区图片
   BufferedImage image=ImageIO.read(file);
   //通过下标来实现替换图片中的每个像素
   String base="@#&$%*!;.";
     //图片都有一个个像素点组成的
  //用两个for循环进行遍历
   for(int y=0;y<image.getHeight();y+=2){
    for(int x=0;x<image.getWidth();x++){
     int ps=image.getRGB(y, x);
     //System.out.println(pixe);//输出图片像素输出的值
     /**
      * 该像素位置RGB颜色的一个整数形式(RGB颜色:黄绿蓝)
      * 0XABCDEF
      * 0X:代表声明进制
      * AB:代表R
      * CD:代表G
      * EF:代表B
      *
      * getRGB调用一个colorMode(颜色模型).getRGB()
      * | 反推  &
      * 16 --》  8 ---》 0
      *
      * getRGB的源码的实现方法
      * public int getRGB(int x,int y){
      *    return colorModel.getRGB(raster.getDataElement(x,y,null));
      * }
      * 可以按Ctrl+鼠标左键继续进行看它的底层源码(有兴趣的可以继续去了解)
      * */
     int r=(ps & 0xff0000)>>16;
     int g=(ps & 0xff00)>>8;
     int b=(ps & 0xff);
     //计算灰度值 r g b 乘以相应的灰度值
     float gray=r * 0.4f + g * 0.6f + b * 0.1f;
     //计算下标的公式
     int index=Math.round(gray*(base.length()+1)/255);
    //判断下标和上面的字符去比较
     if(index>=base.length()){
      //如果下标比上面的字符要长的话就不填充
      System.out.print("  ");
     }else{
      //选择相应下标的字符进行填充
      System.out.print(base.charAt(index));
     }
     }
    System.out.println();
   }
   }
}

运行结果:部分截图

Java图片转字符的更多相关文章

  1. Java 图片转换为字符图 CharMaps (整理)

      /* * Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * * @(#)CharMaps.java 2014/1/16 * 1.这个一 ...

  2. java 字节流和字符流的区别 转载

    转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...

  3. java 字节流和字符流的区别

    转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...

  4. Java 图片提取RGB数组 RGBOfCharMaps (整理)

    package demo; /** * Java 图片提取RGB数组 RGBOfCharMaps (整理) * 声明: * 和ImageCombining配合使用的工具,这里是提取图片的R.G.B生成 ...

  5. Java进阶(四十五)java 字节流与字符流的区别

    java 字节流与字符流的区别(转载)   字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?   实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作 ...

  6. Springboot 系列(八)动态Banner与图片转字符图案的手动实现

    使用过 Springboot 的对上面这个图案肯定不会陌生,Springboot 启动的同时会打印上面的图案,并带有版本号.查看官方文档可以找到关于 banner 的描述 The banner tha ...

  7. 32. Springboot 系列(八)动态Banner与图片转字符图案的手动实现

    使用过 Springboot 的对上面这个图案肯定不会陌生,Springboot 启动的同时会打印上面的图案,并带有版本号.查看官方文档可以找到关于 banner 的描述 The banner tha ...

  8. Java 字节流和字符流

    程序中都是以流的形式进行数据的传输和保存,在java.io包中数据流操作的两大类是字节流和字符流. 1. 字节流 InputStream和OutputStream是所有表示字节流的类的父类,它们都是抽 ...

  9. java字节流和字符流,以及java文件操作

    A.首先说字节流:1.字节流在操作的时候不会用到缓冲区(也就是内存)2.字节流可用于任何类型的对象,包括二进制对象3.字节流处理单元为1个字节,操作字节和字节数组.InputStream是所有字节输入 ...

随机推荐

  1. Css3 实现关键帧动画

    <div class="person"> </div> <script> var str1 = "@keyframes move{&q ...

  2. [转]Asp.Net url中文乱码

    一般有3种方法: 1.设置web.config文件 2.传递中文之前,将要传递的中文参数进行编码,在接收时再进行解码.  传递 string Name = "中文参数"; Resp ...

  3. 19-3-4 Python进制转换;bool str int三者之间的转换;字符串的索引,切片;for循环的使用

    进制转换: 二进制转十进制:  0010 1111 = 1*2**0+1*2**1+1*2**2+1*2**3+1*2**5 十进制转换二进制: 用十进制数除2逆序取余 --->101010 布 ...

  4. git获取步骤

    $ git init $ git config --global user.name "[name]" $ git config --global user.email [emai ...

  5. 鸟哥私房菜笔记-1 (S0_S3)

    学新东西,总感觉还是看书来的实在,直接看教程上手太慢且没有目的, 接下来先啃鸟哥这本吧,买的第三版,内容在鸟哥站上都有: 鸟哥的 Linux 私房菜 -- 基础学习篇目录 (繁体) http://cn ...

  6. 新人成长之入门Vue.js弹窗Dialog介绍(二)

    前言 在上一篇博文中介绍了Vue.js的常用指令,今天总结归纳一下弹窗Dialog的使用,弹窗经常被使用在一些表单的增删改查啊,或者弹出一些提示信息等等,在保留当前页面状态的情况下,告知用户并承载相关 ...

  7. 用Head方法获得百度搜索结果的真实地址

    用Head方法获得百度搜索结果的真实地址 在百度中搜索"Java",第一条结果的链接为: https://www.baidu.com/link?url=HBOOMbhPKH4SfI ...

  8. django的render的特殊用法

    以前都是将模板渲染好, 传输到前端, 但是现在前后端分离了, 模板渲染引擎还有用, 而且很好用. 比如在渲染一个表格的时候, 每一行都有两个操作按钮, 并且这个按钮上是有a标签的 你可以使用字符串拼接 ...

  9. Java : Netty 入门案例

    接收端代码: public class IOServer { public static void main(String[] args) throws IOException, Interrupte ...

  10. 【laravel】同一代码段内,先更新数据,后查询修改的数据,查询结果错误的问题

    如标题所言,是什么意思呢?举个栗子,需求如下: 你是一个电话销售人员,手头有一些待call电话单,每个电话单上有N个不同的电话号码,需要你每打一个电话就标记为”已打“.当一个电话单上的号码都标记为”已 ...