中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用java實現靜態圖片轉靜態圖片

發布時間:2021-11-17 09:16:56 來源:億速云 閱讀:290 作者:iii 欄目:大數據

本篇內容主要講解“怎么使用java實現靜態圖片轉靜態圖片”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用java實現靜態圖片轉靜態圖片”吧!

靜態圖片轉靜態圖片

其實原理很簡單,讀取圖片的像素,新建一張大小一樣的圖片,根據原圖像素的灰度,決定是不是要顯示出來,并在新圖相應的位置添加字符,這樣就完成了

先來看下效果圖,如下

怎么使用java實現靜態圖片轉靜態圖片

怎么使用java實現靜態圖片轉靜態圖片

代碼實現

主要包含一下四個類: AnimatedGifEncoder GifDecoder LZWEncoder NeuQuant

環境:

JDK 1.8

注:Java原生代碼實現使用jdk內部的GIFImageReader、GIFImageWriter等類,maven在編譯的時候會提示這是sun公司的私有API,在1.7、1.8版的JDK中已經刪除,所以是有風險的。在此使用ImageIO這個類來進行圖片的操作。

測試代碼:

    @Test
    public static void imgTest() 
        String inputFile = "F:/123/head.png";
        String outputFile = "F:/123/head_copy.png";
        // String base = "01"; // 替換的字符串
        String base = "@#&$%*o!;.";// 字符串由復雜到簡單
        int threshold = 8;// 閾值
        ImgUtil.toTextImg(inputFile, outputFile, base, threshold);
    }

參數調整

具體參數調整如下圖所示:

怎么使用java實現靜態圖片轉靜態圖片

  1. 調整字符大小,顏色

  2. 調整字符間距

  3. 調整字符的區域 (index數值越小,灰度越大)

完整代碼如下所示:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @ClassName: ImgUtil
 * @Description: TODO
 * @author jiang
 * @date 2018年8月14日 下午10:15:56
 * 
 */
public class ImgUtil {

    static Logger logger = LoggerFactory.getLogger(ImgUtil.class);

    public static boolean toTextImg(String inputFile, String outputFile, final String base, int threshold) {

//        String blackFile = "F:/123/head_black.png";
        BufferedImage src = null;
        BufferedImage tag = null;
        boolean res = false;
        try {
            src = ImageIO.read(new FileInputStream(inputFile));
            int[] rgb = new int[3];
            int width = src.getWidth();
            int height = src.getHeight();
            int minx = src.getMinX();
            int miny = src.getMinY();
            // 黑白化
/*-                        
            src = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null).filter(src, null);
            res = ImageIO.write(src, blackFile.substring(blackFile.lastIndexOf(".") + 1), new File(blackFile));
            src = ImageIO.read(new FileInputStream(blackFile));*/

            tag = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
            Graphics g = tag.getGraphics();
            g.setFont(new Font("微軟雅黑", Font.PLAIN, 10));// 設置字體
            g.setColor(Color.BLUE);// 設置顏色
            for (int x = minx; x < width; x += 6) {
                for (int y = miny; y < height; y += 6) {
                    int pixel = src.getRGB(x, y); // 下面三行代碼將一個數字轉換為RGB數字
                    rgb[0] = (pixel & 0xff0000) >> 16;// red
                    rgb[1] = (pixel & 0xff00) >> 8;// green
                    rgb[2] = (pixel & 0xff);// blue
                    final float gray = 0.299f * rgb[0] + 0.578f * rgb[1] + 0.114f * rgb[2];
                    final int index = Math.round(gray * (base.length() + 1) / 255);
//                    logger.debug("{},{}",index,base.length() / threshold);
                    if (index <= threshold) {
                        g.drawString(String.valueOf(base.charAt(index % base.length())), x, y);// 文字的編寫及位置
                    }

                    /*-
                    if (rgb[0] + rgb[1] + rgb[2] <= 500) {
                        System.out.println("i=" + i + ",j=" + j + ":(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")");
                        g.drawString("v", i, j);// 文字的編寫及位置
                    }*/
                }
            }
            g.dispose();

            // 輸出圖片
            res = ImageIO.write(tag, outputFile.substring(outputFile.lastIndexOf(".") + 1),
                    new File(outputFile));
            logger.debug("字符化結果:{}", res);
        } catch (IOException e) {
            logger.error("err", e);
            return false;
        }
        return true;
    }

}

代碼的思路很簡單,src.getRGB(x, y)獲取具體像素點的顏色值,共六位,每兩位一個顏色值,依次是red、green、blue,類似的使用

(pixel & 0xff0000) >> 16

獲取第一位的紅色等,根據灰度公式

Gray = R/*0.299 + G/*0.587 + B/*0.114

計算灰度(百度顏色灰度公式,有很多來計算心理灰度的解決方案),選擇合適的灰度替換上合適的字符即可

到此,相信大家對“怎么使用java實現靜態圖片轉靜態圖片”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

股票| 陈巴尔虎旗| 林周县| 民权县| 大冶市| 筠连县| 夏河县| 五台县| 额尔古纳市| 洪湖市| 郓城县| 长岛县| 邮箱| 黄平县| 马龙县| 沁阳市| 三门县| 泊头市| 理塘县| 绥滨县| 琼中| 孝感市| 奇台县| 嘉禾县| 汉中市| 广德县| 兴文县| 德令哈市| 南皮县| 常宁市| 湘潭县| 巴东县| 石城县| 固始县| 万年县| 浦城县| 鄱阳县| 泊头市| 额敏县| 台前县| 手游|