|
- 依照这个原理,可以吧视频变成代码视频
( G$ c. u& `9 i+ t+ A; l# t- D- F( J j3 I - /**- W6 x! ?- o3 `9 s
- * 将图片转换成字符图5 v: n0 x* H7 V6 c7 K
- * @param inPath 原始图片! L. ~/ T6 u9 W
- * @param outPath 输出图片
3 v7 X: S6 W3 s7 X* M/ T - * @author HBK 3243430237@qq.com
' ?9 D6 w$ z! W- I4 O$ b9 W. X5 c1 u. b - */
, \& {' [. c0 G. ?' p3 `( U - public static void reverse(File inPath, File outPath) {' L" l, z" o1 Y! s
- // 图片放大倍数,一个像素点无法容纳一个汉字,所以需要放大" T; R2 U7 \$ T9 ]0 H; H; ?
- int scale = 12;5 V: R. W* ~( r5 h6 r
- // 这里的字应该按笔画从少到多排序,笔画越少越黑,越多则越白。
+ @0 J+ u8 `4 r+ Y) g) `' _6 h - String[] digits = "天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰馀".split("");
* N6 ~' d9 k1 Y3 a! S& g/ v - try {
+ D0 \( F/ P5 @# s - // 读取源图片
) I, F% Y# F3 t4 r l: c+ r - BufferedImage image = ImageIO.read(inPath);' }' t! b, w) y* Y N. b% t- z
- // 获取图片的尺寸
5 j& u$ b0 P% t7 X( m: M - int width = image.getWidth();+ r, q' L$ r" m* W2 G7 X" r
- int height = image.getHeight();
2 D9 G- q/ B5 L - // 灰度值
J) q8 I% z& A U! f6 T# M v - int gray;3 D' b, O* t1 K! e2 r- x
- // 创建新图片,放大一定的倍数
* ~1 z2 t( H7 g6 r, ]6 H/ Q% z - BufferedImage outImg = new BufferedImage(+ p* i- B$ W2 O0 V0 m7 m
- width * scale,
4 l, b+ J7 m2 Y - height * scale,
+ l( y- z1 k5 ]1 s" F - BufferedImage.TYPE_INT_RGB, Y$ i2 X o2 q# l# t) S+ Q( M
- );; s- A0 c( L6 P7 u( O
- // 创建图形处理器
2 {2 I$ r& n+ a# c, }9 M2 k5 t - Graphics2D graphics = outImg.createGraphics();+ F- }% _8 j- g3 s4 a/ |
- // 设置字体" c# t' ?; ~! P' p
- Font font = new Font(null, Font.PLAIN, 12);
& L% W3 W9 S2 o F; K& [, G - graphics.setFont(font);
- W7 k' N5 W2 ^/ ?6 t9 J; h - // 设置默认的背景颜色
* R( U9 J5 c/ P0 ^ - graphics.setBackground(Color.WHITE);4 F3 s5 b) z* u* x
- // 遍历图片的像素点
- j- `! E* c& r; m. W - for (int i = 0; i < width; i++) {! L8 d" O7 v1 k3 H
- for (int j = 0; j < height; j++) {# R) `! ~) X# G3 W8 _
- // 获取当前像素点的RGB颜色
% d2 r' G w, H; X0 \& n7 O) | - int rgb = image.getRGB(i, j);
/ {/ \ v, Z+ \' w - int r = (rgb & 0xff0000) >> 16;
# U% `2 u9 c: o; B7 A+ N - int g = (rgb & 0xff00) >> 8;! ?+ }( ]# U" z; v% |" |9 t
- int b = (rgb & 0xff);( ?+ I4 p3 j4 W4 N* n/ K4 ~: o7 r
- // 计算出灰度值,这个公式可以百度到8 J. o; ?8 y- b# u& ]+ v
- gray = (int) (r * 0.299f + g * 0.587f + b * 0.114f);
$ u3 M6 L3 G, P' U' q5 W: m - System.out.printf("R: %d, G: %d, B: %d, Gray: %d, String: %s\n", r, g, b, gray, digits[gray / 10]);0 K7 t: ~# w/ l0 Y* ~% S
- // 设置好现在的颜色,不设置则是黑白图片
; @3 P9 y! w9 I" i2 V - graphics.setColor(new Color(r, g, b));, N8 g! |) f& X1 U- L4 _; X
- // 依据灰度把相关的字画上去# O9 P7 U, Z6 E' K
- graphics.drawString(digits[gray / 10], i * scale, j * scale);2 ]3 |9 @1 ]7 Q6 `* P( ]
- }( g( L1 y3 m: w9 Y. }' Y# ]: j
- }
; k. `* u3 U: t# P3 [3 r: B7 q - // 输出图片
* { i+ M" D# [( ]# Q. s- h - ImageIO.write(outImg, "jpg", outPath);
+ V' q6 y5 f1 V H/ k - } catch (IOException e) {0 w- g7 c& f. P$ L1 v/ e
- e.printStackTrace();
. ^: {5 w" ~+ ] ]3 f: ] - }
; b1 ^+ N) |- y' A/ d - }
复制代码 |
|