1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
library(magick)
image2chars = function(
pathIn = '',
pathOutTxt = NULL,
pathOutImg = NULL,
jpg_quality = 80,
width = 100,
chars = c('&', '#', 'w', 's', 'k', 'd', 't', 'j', 'i', '.', ' '),
isColor = FALSE
){
# pathIn: 原始图片的路径,支持各种格式。
# pathOutTxt: 字符文本的输出路径,默认与原始图片在同一文件夹下。
# pathOutImg: 字符图片的输出路径,默认与原始图片在同一文件夹下。
# jpg_quality: 字符图片的质量,范围0-100。
# width: 字符文本的宽度,默认为100,即一行100个字符。
# chars: 字符集,可自定义;
# isColor: 字符图片是否为彩色,默认为黑白字符图片
img = image_read(pathIn) # 读入图片
gray = image_convert(img, colorspace = 'gray') # 转为灰度图
rgb = image_convert(img, colorspace = 'rgb') # 转为rgb图
# 修改图片尺寸
gray = image_resize(gray, paste0(width, 'x'))
rgb = image_resize(rgb, paste0(width, 'x'))
# 获取图片灰度值矩阵,并将各像素值对应于相应字符
gray = as.integer(image_data(gray))[, , 1]
w = ncol(gray) # 图片宽度
h = nrow(gray) # 图片高度
index = findInterval(
c(gray),
seq(0, 255, length.out = length(chars) + 1),
rightmost.closed = T
)
labels = chars[index]
labels_mat = matrix(labels, ncol = w)
# 输出字符文本,并保存成文件
if(is.null(pathOutTxt))
pathOutTxt <- paste0(gsub(".png", "", pathIn), ".txt")
write.table(labels_mat, pathOutTxt, quote = F, row.names = F, col.names = F)
# 绘制字符图片,给相应字符着色,并保存成文件
if(isColor){
rgb = as.integer(image_data(rgb))
r = rgb[, , 1] # red通道像素矩阵
g = rgb[, , 2] # green通道像素矩阵
b = rgb[, , 3] # blue通道像素矩阵
cols = rgb(c(r), c(g), c(b), maxColorValue = 255) # 转化为颜色表示
}
if(is.null(pathOutImg))
pathOutImg = paste0(gsub(".png", "", pathIn), ".jpg")
jpeg(pathOutImg, width = 16 * w, height = 16 * h, quality = jpg_quality)
op = par(mar = c(0, 0, 0, 0))
plot(
0, xlab = '', ylab = '', asp = 1,
xlim = c(0, w), ylim = c(0, h),
xaxs = "i", yaxs = "i",
type = 'n', axes = FALSE
)
grid = expand.grid(y = h:1 - 0.5, x = 1:w - 0.5) # 各字符位置
if (isColor) {
text(grid$x, grid$y, labels, cex = 1.5, col = cols) # 绘制彩色字符
} else {
text(grid$x, grid$y, labels, cex = 1.5) # 绘制黑白字符
}
par(op)
dev.off()
}
|