您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么使用java實現(xiàn)靜態(tài)圖片轉(zhuǎn)靜態(tài)圖片”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用java實現(xiàn)靜態(tài)圖片轉(zhuǎn)靜態(tài)圖片”吧!
其實原理很簡單,讀取圖片的像素,新建一張大小一樣的圖片,根據(jù)原圖像素的灰度,決定是不是要顯示出來,并在新圖相應(yīng)的位置添加字符,這樣就完成了
先來看下效果圖,如下
主要包含一下四個類: AnimatedGifEncoder GifDecoder LZWEncoder NeuQuant
JDK 1.8
注:Java原生代碼實現(xiàn)使用jdk內(nèi)部的GIFImageReader、GIFImageWriter等類,maven在編譯的時候會提示這是sun公司的私有API,在1.7、1.8版的JDK中已經(jīng)刪除,所以是有風險的。在此使用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); }
具體參數(shù)調(diào)整如下圖所示:
調(diào)整字符大小,顏色
調(diào)整字符間距
調(diào)整字符的區(qū)域 (index數(shù)值越小,灰度越大)
完整代碼如下所示:
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));// 設(shè)置字體 g.setColor(Color.BLUE);// 設(shè)置顏色 for (int x = minx; x < width; x += 6) { for (int y = miny; y < height; y += 6) { int pixel = src.getRGB(x, y); // 下面三行代碼將一個數(shù)字轉(zhuǎn)換為RGB數(shù)字 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("字符化結(jié)果:{}", res); } catch (IOException e) { logger.error("err", e); return false; } return true; } }
代碼的思路很簡單,src.getRGB(x, y)獲取具體像素點的顏色值,共六位,每兩位一個顏色值,依次是red、green、blue,類似的使用
(pixel & 0xff0000) >> 16
獲取第一位的紅色等,根據(jù)灰度公式
Gray = R/*0.299 + G/*0.587 + B/*0.114
計算灰度(百度顏色灰度公式,有很多來計算心理灰度的解決方案),選擇合適的灰度替換上合適的字符即可
到此,相信大家對“怎么使用java實現(xiàn)靜態(tài)圖片轉(zhuǎn)靜態(tài)圖片”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。