将字母映射为图像层中的0/1值

时间:2017-04-29 14:33:28

标签: r image

我想将一个字符映射到图像层的0/1值。例如,转换字母" A"到0/1的矩阵,当它被打印时,它显示一个" A"。我想出了以下内容:

library(raster)
library(png) 

# write character to temp png file and read back in as matrix

letter_to_matrix <- function(chr="", size=10)
{
    tf <- tempfile(fileext = ".png")   
    png(tf, width = size, height=size)   # save as temp png file
      par(mar=c(0,0,0,0))
      plot(0:1,0:1, type="n", frame=F, xaxt="n", yaxt="n", xlab="", ylab="")
      text(.5,.5, chr, cex=1)
    dev.off()

    p <- png::readPNG(tf)     # read in png file as array
    apply(p, 1:2, mean)       # average over layers
}

 size = 10
 m <- letter_to_matrix("a", size)
 r <- raster::raster(nrows=size, ncols=size)
 raster::values(r) <- m
 raster::plot(r,  col=c(0,1), legend=F))

正如您在下面看到的字母&#34; a&#34;和&#34; b&#34;它不是很完美。 我在这里寻找更好的解决方案。

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

有趣的想法,但您可以直接使用Pixel字体。例如&#34; font.c&#34;来自SGI的OpenGL SDK:

charList <- list()
c(0x00, 0x00, 0x7d, 0xc3, 0xc3, 0xc3, 0x7f, 0x03, 0x7e, 0x00, 0x00, 0x00, 0x00) -> charList$a
c(0x00, 0x00, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0) -> charList$b
c(0x00, 0x00, 0x7f, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00) -> charList$c
apply(sapply(charList$a, intToBits)[1:12,1:12], c(1,2), as.integer) -> m
anticolockRotateMat <- function(x) apply(x,1,rev)
r <- raster::raster(nrows=12, ncols=12)
raster::values(r) <- (1-anticolockRotateMat(m))[,12:1]
raster::plot(r,  col=c(0,1), legend=F)

可以在Open GL源代码中找到完整的Hex代码。您也可以使用其他像素字体(如果您获得十六进制代码)。有很多8位免费字体在线。