Java implementation of picture-to-character output sample demo

The previous blog posts introduced the use of jdk to do some interesting conversions to pictures. Next, we will introduce an interesting gameplay. Directly output a two-dimensional character array based on the picture to realize the scene of painting with characters.

<!-- more -->

You guys may have seen some interesting notes, such as big Buddha, beautiful women, etc., clear this article, I believe you can also easily achieve similar scenes

The key realization is actually mentioned in the previous article, the following is the hyperlink

The next thing we need to do is to slightly change the output of the previously converted character image, and select the appropriate replacement character according to the current color and save it.

So the key realization is how to choose characters according to color

// 这个字符来自于github搜索结果,下面将最后一个从原来的点号改成了空格,即白色时,不输出字符
private static final String DEFAULT_CHAR_SET = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\\\"^`' ";

/**
 * 基于颜色的灰度值,获取对应的字符
 * @param g
 * @return
 */
public static char toChar(Color g) {
    double gray = 0.299 * g.getRed() + 0.578 * g.getGreen() + 0.114 * g.getBlue();
    return DEFAULT_CHAR_SET.charAt((int) (gray / 255 * DEFAULT_CHAR_SET.length()));
}

Next, we will modify the previous method a bit

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);
}

private void parseChars(BufferedImage img) {
    int w = img.getWidth(), h = img.getHeight();
    // 这个size可用来控制精度,越小则越像原图
    int size = 4;
    List<List<String>> list = new ArrayList<>();
    for (int y = 0; y < h; y += size) {
        List<String> line = new ArrayList<>();
        for (int x = 0; x < w; x += size) {
            Color avgColor = getAverage(img, x, y, size, size);
            line.add(String.valueOf(toChar(avgColor)));
        }
        list.add(line);
    }

    System.out.println("---------------------- 开始 ------------------------");
    for (List<String> line: list) {
        for (String s: line) {
            System.out.print(s + " ");
        }
        System.out.println();
    }
    System.out.println("---------------------- 结束 ------------------------");
}

Pay attention to the above implementation, the important thing to pay attention to is the traversal method of the original image, layer by layer, that is, the outside is the y-axis, and the inner loop is the x-axis.

Next look at the test case

@Test
public void testChars() throws Exception{
    String file = "http://pic.dphydh.com/pic/newspic/2017-12-13/505831-1.png";
    BufferedImage img = ImageLoadUtil.getImageByPath(file);
    // 缩放一下图片为300x300,方便对输出字符截图
    img = GraphicUtil.scaleImg(300,300, img);
    parseChars(img);
    System.out.println("---over------");
}

The actual output is as follows (the actual output is still very similar to Pishen)

---------------------- 开始 ------------------------
                                                                                          l m                                                         
                                                                                        ' b $ I                                                       
                                                                                        f $ $ [                                                       
                                                                                      \ 8 $ $ f                                                       
  i ~ ,                                                                               x $ $ $ u                                                       
  _ $ $ a X } ^                                                                     ' W $ $ $ c                                                       
    c $ $ $ $ B L ] '                                                               } q $ $ $ z                                                       
    ` d $ $ $ $ $ 0 r ( "                                                           t < U $ $ c                                                       
      , * $ $ $ $ z < + j | `                                                     \ t < < O $ n                                                       
        l W $ $ $ U < < < ~ t [                                                   { + < < _ W f                                                       
          > & $ $ 0 < < < < < - j ~                                               \ < < < < n (                                                       
            ! # $ k < < < < < < < ( t `                                           j < < < < ] ?                                                       
              : k B 1 + < < < < < < + n !                                       > } < < < < \ i                                                       
                ^ C z ( [ ~ < < < < < < f ]                                     1 < < < < < u `                                                       
                    1 v ( ) ? < < < < < < | {                                   ( < < < < < u                                                         
                      I v / ( 1 + < < < < < 1 }   ' l > i "                     \ < < < < ~ x                                                         
                          1 v ( ( [ ~ < < < < z r z t | \ n z f ( + '           t < < < < ? /                                                         
                            " / v | ) ? < < < < < < < < < < < < < ] f ) ^     " \ < < < < | ?                                                         
                                " ) n v / ~ < < < < < < < < < < < < < ~ j [   l 1 < < < + z ^                                                         
                                      - | < < < < < < < < < < < < < < < < ] j ~ { < < < [ u                                                           
                                    ' f < < < < < < < < < < < < < < < < < < ~ z | < < ~ ( /                                                           
                                    ] + < < < < < < < < < < < < < < < < < < < < n - < ? n i                                                           
                                  ' | < < < < < < < < < < < < < < < < < < < < < < { ~ ) v                                                             
                                  ) + < ] 0 w f < < < < < < < < < < < < < < < < < < ? / 1                                                             
                                  x < ~ * @ " | [ < < < < < < < < < < < < < < < < < } c '                                                             
                                i ( < } $ $ x w \ < < < < < < < < < < < < < < < < < / -                                                               
                                / < < + % $ $ 8 _ < < < < < < < < < < < < < < < < < { >                                                               
                              _ q f < < ( q m } < < < < < < < < < < < < { \ ~ < < < } <                                                               
                            " O U Z < < < < < < < < < < n f < < < < < n r [ h + < < \ "                                                               
                            j U U 0 } < < < < _ < < < < ~ ~ < < < < < M u ( $ r < < t                                                                 
                            U U U Q ( < < < < { Y v Y 0 Z } < < < < < * $ $ $ x < < |                                                                 
                            J U U O [ < < < < < # * # # o a t < < < < j $ $ # _ < < )                                                                 
                            Y U U O < < < < < < W b q q k # # O r \ < < [ / + < < } <                                                                 
                            x U L r < < < < < < d U c c C w * o L < < < < < < < < f '                                                                 
                            } Q n < < < < < < < J x x x x z w W [ < < < < < < < < f         : + [ { ,                                                 
                            ^ f < < < < < < < < L x x x x x J Y < < < < < < _ Y O Y   ] \ j \ [ _ } -                                                 
                              / < < < < < < < < L x x x x x C _ < < < < < - Z U U Z j ? < < < < < \ v >                                               
                              l | < < < < < < < Y x x x x X | < < < < < < J U U U z < < < < < < < + ) (                                               
                        i ) t / L | + < < < < < c x x x c x < < < < < < ) L U U C t < < < < < < < < f !                                               
                    ? x ( < < < < ? f x j ~ < < 1 J x Y x < < < < < < < u U U U 0 < < < < < < < < + r                                                 
                  1 { < < < < < < < < < _ x \ < < t v 1 < < < < < < < < n U U Z [ < < < < < < < v x _                                                 
                < ) < < < < < < < < < < < < { u ] < < < < < < < < < < < - 0 m { < < < < < < < } n | / n r ( / \ 1 } i '                               
                / < < < < < < < < < < < < < < ~ U < < < < < < < < < < < | c _ < < < < < < < - n < < < < < < < < < < { f / ( ] ^                       
                | < < < < < < < < < < < < < < < ) n ] _ ~ < < < < < / n 1 < < < < < < < ~ [ L + < < < < < < < < < < < < < < _ t / 1 l                 
                t < < < < < < < < < < < < < < < v j ( ( ) - < < ~ } + < < < < < < < < _ 1 Q j < < < < < < < < < < < < < < < < < < < ) f ( :           
                ) + < < < < < < < < < < < < < < c [ ] ? ~ < < < < < < < < < < < < ~ } ( c t [ < < < < < < < < < < < < < < < < < < < < < ~ / t <       
                ^ x { } ] ] - _ ~ < < < ~ _ ~ r c < < < < < < < < < < < < < < < - ) ( u < \ < < 1 - < < < < < < < < < < < < < < < < < < < < < \ )     
                  < c ( ( ( ( ( ( ( ) ) / Y n n < < < < < < < < < < < < < < ~ { ( ( v i   f < _ ( ( 1 _ < < < < < < < < < < < < < < < < < < + j '     
                    ! v n ( ( ( ( r X c f ~ < < < < < < < < < < < < < < < ~ 1 ( ( c ;     r < ] ( ( ( ( } + < < < < < < < < < < < < < < < + f '       
                        ] X x u u | + < < < < < < < < < < < < < < < < < < { ( t n ^     \ f < { ( ( ( ( ( ( [ ~ < < < < < < < < < < < < + / '         
                        t ~ < < < < < < < < < < < < < < < < < < < < < < - ( v {         ? ] < ) ( ( ( ( ( ( ( ) ? < < < < < < < < < < + \             
                        u < < < < < < < < < < < < < < < < < < < < < < < { w :           \ < + ( ( ( | ( ( ( ( ( ( { ~ < < < < < < < ~ (               
                      i \ < < < < < < < < < < < < < < < < < < < < < < < ~ n             j < - ( ( / x t c n ( ( ( ( ) - < < < < < ~ (                 
                      t < < < < < < < < < < < < < < < < < < < < < < < < < n   + ] :     x < [ ( ( v '     ! | n X \ ( ( [ < < < ~ /                   
                      u < < < < < < < < < < < < < < < < < < < < < < < < < x   ( 1 | r t ( < { ( x +             " { j z r { ~ ~ f '                   
                    ~ 1 < < < < < < < < < < < < < < < < < < < < < < < < < t   ] t 1 + < < < ( ( x                     ' ~ / n u ^                     
                    t < < < < < < < < < < < < < < < < < < < < < < < < < < \   i n ( ( ? < + ( v :                                                     
                  ' r < < < < < < < < < < < < < < < < < < < < < < < < < < /   " z ( ( ( } ] | \                                                       
                  _ [ < < < < < < < < < < < < < < < < < < < < < < < < < < t     L t \ Y u z z `                                                       
                  / < < < < < < < < < < < < < < < < < < < < < < < < < < < / ;   Z Q Q \   , I                                                         
                ' f < < < < < < < < < < < < < < < < < < < < < < < < < < < + # 0 d d d }                                                               
                ] ? < < < < < < < < < < < < < < < < < < < < < < < < < < < < Z d d d b ?                                                               
                \ < < < < < < < < < < < < < < < < < < < < < < < < < < < < < u o b d k ~                                                               
                j < < < < < < < < < < < < < < < < < < < < < < < < < < < < < ] | ? u d :                                                               
                j < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < j                                                                       
                r < ~ < < < < < < < < < < < < < < < < < < < < < < < < < < < < /                                                                       
                / + ( ( { ? + < < < < < < < < < _ ? ] ] ] ] ] - + < < < < < < f                                                                       
                i f ( ( ( ( ( 1 { } [ [ [ } 1 ( ( ( ( ( ( ( ( ( ( ) } _ < < < /                                                                       
                  ] X ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( } < < |                                                                       
              : ( f ) v u ( ( \ j u c c u x J d m C J | ( ( ( ( ( ( ( ( ( [ r \                                                                       
          ` \ J t ] ~ { ( ( n X r , '         ` < ( j c C z r ( ( ( ( ( | n z }                                                                       
          u X z r } / u c f \ 1                           l ] j z J Y Y n ) } } v _                                                                   
          + r ( ) ( - I                                         I n c \ + < < ] L Z u ^                                                               
                                                                    ' i ] } | ( - x O w                                                               
                                                                              ; 1 \ z J                                                               
---------------------- 结束 ------------------------

Although the above is the output of the character map, it is also comparable in terms of the result, but it should be noted that if the background of the picture is not white and the protagonist is not so prominent in the scene, the result output by the above method may not be very friendly. , Of course, the solution is to identify the background, identify the subject, and transform the subject element (this process will have a chance to be introduced later)

Next, we use the open source project https://github.com/liuyueyi/quick-media to quickly realize the character image output

Use a conversion image of the Snow Queen to verify the effect

String file = "http://5b0988e595225.cdn.sohucs.com/images/20200410/76499041d3b144b58d6ed83f307df8a3.jpeg";
BufferedImage res = ImgPixelWrapper.build().setSourceImg(file).setBlockSize(4).setPixelType(PixelStyleEnum.CHAR_BLACK).build().asBufferedImg();

Yihuihui's contact information

It’s not as good as no book. The above content is purely a family statement. Due to limited personal ability, omissions and errors are unavoidable. If you find a bug or have better suggestions, you are welcome to criticize and correct me. I am grateful.

QrCode


小灰灰Blog
251 声望46 粉丝