最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java圖片轉(zhuǎn)字符圖片的生成方法

 更新時(shí)間:2021年11月17日 09:54:37   作者:一灰灰  
本文主要實(shí)現(xiàn)了將一張圖片轉(zhuǎn)成字符圖片,同樣可以遍歷每個(gè)像素點(diǎn),然后將像素點(diǎn)由具體的字符來替換,從而實(shí)現(xiàn)字符化處理,感興趣的可以了解一下

前面介紹了一篇java實(shí)現(xiàn)圖片灰度化處理的小demo,接下來再介紹一個(gè)有意思的東西,將一個(gè)圖片轉(zhuǎn)換成字符圖片

借助前面圖片灰度化處理的知識點(diǎn),若我們希望將一張圖片轉(zhuǎn)成字符圖片,同樣可以遍歷每個(gè)像素點(diǎn),然后將像素點(diǎn)由具體的字符來替換,從而實(shí)現(xiàn)字符化處理

基于上面這個(gè)思路,具體的實(shí)現(xiàn)就很清晰了

@Test
public void testRender() throws IOException {
    String file = "http://i0.download.fd.52shubiao.com/t_960x600/g1/M00/10/17/oYYBAFWvR5-IeXHuAAd5kPb8eSgAACm0QF50xIAB3mo414.jpg";
    // 從網(wǎng)絡(luò)上下載圖片
    BufferedImage img = ImageIO.read(FileReadUtil.getStreamByFileName(file));


    int w = img.getWidth(), h = img.getHeight();
    // 創(chuàng)建新的字符圖片畫板
    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("渲染完成");
}

注意上面的實(shí)現(xiàn),在會字符的時(shí)候,先取出源像素點(diǎn)的色彩,然后重新設(shè)置給g2d,這個(gè)int轉(zhuǎn)color也比較簡單,實(shí)現(xiàn)如下

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

這樣就實(shí)現(xiàn)了一個(gè)基礎(chǔ)版的轉(zhuǎn)字符圖了,實(shí)際跑一下看看效果

這下尷尬了,輸出的并不是我們預(yù)期的字符圖,那么問題出在哪呢?

仔細(xì)看上面的文字大小為1,文字太小,導(dǎo)致即使是有字符組件的圖,最終肉眼看起來和原圖也沒啥區(qū)別

那么我們就試一下將這個(gè)文字搞大點(diǎn),將n*n個(gè)像素點(diǎn)作為一個(gè)文字渲染區(qū)域,這樣我們需要調(diào)整一下遍歷的步長;其次就是這個(gè)區(qū)域的顏色怎么定

直接取均值

/**
 * 求取多個(gè)顏色的平均值
 *
 * @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";
    // 從網(wǎng)絡(luò)上下載圖片
    BufferedImage img = ImageIO.read(FileReadUtil.getStreamByFileName(file));


    int w = img.getWidth(), h = img.getHeight();
    // 創(chuàng)建新的灰度圖片畫板
    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("渲染完成");
}

再次執(zhí)行之后結(jié)果如下,實(shí)現(xiàn)了我們的預(yù)期效果

最后再介紹一個(gè)更好用的姿勢,直接使用開源項(xiàng)目https://github.com/liuyueyi/quick-media 來實(shí)現(xiàn)圖片字符畫
使用這個(gè)項(xiàng)目的 image-plugins 之后,生成一個(gè)灰度圖就很簡單了

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

注意這個(gè)ImgPixelWrapper封裝類,處理基礎(chǔ)的字符處理之外,還支持生成灰度圖,gif圖轉(zhuǎn)字符動(dòng)畫,圖片像素化(如馬賽克...)

至于quick-media這個(gè)項(xiàng)目就更有意思了,java側(cè)若想生成酷炫的二維碼,選擇它絕對不會讓你失望;有興趣的小伙伴可以瞅一瞅

到此這篇關(guān)于Java圖片轉(zhuǎn)字符圖片的生成方法的文章就介紹到這了,更多相關(guān)Java圖片轉(zhuǎn)字符圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring-boot-maven-plugin引入出現(xiàn)爆紅(已解決)

    spring-boot-maven-plugin引入出現(xiàn)爆紅(已解決)

    這篇文章主要介紹了spring-boot-maven-plugin引入出現(xiàn)爆紅(已解決),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 詳解大數(shù)據(jù)處理引擎Flink內(nèi)存管理

    詳解大數(shù)據(jù)處理引擎Flink內(nèi)存管理

    Flink是jvm之上的大數(shù)據(jù)處理引擎,jvm存在java對象存儲密度低、full gc時(shí)消耗性能,gc存在stw的問題,同時(shí)omm時(shí)會影響穩(wěn)定性。針對頻繁序列化和反序列化問題flink使用堆內(nèi)堆外內(nèi)存可以直接在一些場景下操作二進(jìn)制數(shù)據(jù),減少序列化反序列化消耗。本文帶你詳細(xì)理解其原理。
    2021-05-05
  • 使用arthas命令redefine實(shí)現(xiàn)Java熱更新(推薦)

    使用arthas命令redefine實(shí)現(xiàn)Java熱更新(推薦)

    今天分享一個(gè)非常重要的命令 redefine ,主要作用是加載外部的 .class 文件,用來替換 JVM 已經(jīng)加載的類,總結(jié)起來就是實(shí)現(xiàn)了 Java 的熱更新,感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • JPA如何使用findBy方法自定義查詢

    JPA如何使用findBy方法自定義查詢

    這篇文章主要介紹了JPA如何使用findBy方法自定義查詢,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • JAVA時(shí)間日期處理類實(shí)例

    JAVA時(shí)間日期處理類實(shí)例

    這篇文章主要介紹了JAVA時(shí)間日期處理類,可實(shí)現(xiàn)遍歷兩個(gè)日期之間的每一天的功能,涉及針對日期的常見操作技巧,需要的朋友可以參考下
    2015-04-04
  • 解決SpringMvc后臺接收json數(shù)據(jù)中文亂碼問題的幾種方法

    解決SpringMvc后臺接收json數(shù)據(jù)中文亂碼問題的幾種方法

    本篇文章主要介紹了解決SpringMvc后臺接收json數(shù)據(jù)中文亂碼問題的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Leetcode常見鏈表問題及代碼示例

    Leetcode常見鏈表問題及代碼示例

    這篇文章主要介紹了Leetcode常見鏈表問題及代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Kotlin 泛型詳解及簡單實(shí)例

    Kotlin 泛型詳解及簡單實(shí)例

    這篇文章主要介紹了 Kotlin 泛型詳解及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Netty的Handler鏈調(diào)用機(jī)制及如何組織詳解

    Netty的Handler鏈調(diào)用機(jī)制及如何組織詳解

    這篇文章主要為大家介紹了Netty的Handler鏈調(diào)用機(jī)制及如何組織示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • spring data 連接mongodb的兩種方式

    spring data 連接mongodb的兩種方式

    這篇文章主要介紹了spring data mongodb連接方式詳解,本文給大家分享兩種連接方式,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08

最新評論

抚顺县| 扶风县| 弥渡县| 安阳县| 宁河县| 沙田区| 锡林浩特市| 米泉市| 炎陵县| 东明县| 南京市| 类乌齐县| 江山市| 阳曲县| 塘沽区| 榕江县| 吴江市| 松滋市| 关岭| 砀山县| 屯昌县| 哈巴河县| 溧阳市| 司法| 浦城县| 赤水市| 板桥市| 寿阳县| 两当县| 青田县| 岱山县| 尚义县| 渭南市| 福鼎市| 长阳| 盈江县| 醴陵市| 巍山| 栾川县| 淮安市| 桂东县|