我有一个很长的字符数组。 我想通过在图像中的各字符进行编码以一定的颜色以基于像素的图像(光栅图像)。 例如,“A”作为红色像素,“B”为紫色,...以及“Z”通过一些其它颜色。 我使用的R用它。
请帮助我,我怎么能产生这样的基于像素的图像。 我搜索了一下,R中栅格和像素图的包,但我是新来的R和不知道如何使用它们我的情况。 任何帮助表示赞赏。 谢谢
我有一个很长的字符数组。 我想通过在图像中的各字符进行编码以一定的颜色以基于像素的图像(光栅图像)。 例如,“A”作为红色像素,“B”为紫色,...以及“Z”通过一些其它颜色。 我使用的R用它。
请帮助我,我怎么能产生这样的基于像素的图像。 我搜索了一下,R中栅格和像素图的包,但我是新来的R和不知道如何使用它们我的情况。 任何帮助表示赞赏。 谢谢
这里是一个可能的解决方案:
library(png)
library(tiff)
library(abind)
# function which plots the image
createImage <- function(txt,charToColorMap,destinationFile,format=c('png','tiff'),debugPlot=FALSE){
# helper function which finds all the divisors of a number
divisors <- function(x){
y <- seq_len(x)
y[ x%%y == 0 ]
}
# split the string in charaters
chars <- strsplit(txt,'')[[1]]
# find the most "squared" rectangle that contains all the characters without padding
d <- divisors(length(chars))
y <- d[length(d) %/% 2]
x <- length(chars) / y
# create an array with 4 matrices (or planes) one for each RGBA channel
RGBAmx <- col2rgb(charToColorMap,alpha=TRUE) / 255
colorIndexes <- match(chars,names(charToColorMap))
colorIndexesR <- matrix(RGBAmx['red',colorIndexes],nrow=y,ncol=x,byrow = TRUE)
colorIndexesG <- matrix(RGBAmx['green',colorIndexes],nrow=y,ncol=x,byrow = TRUE)
colorIndexesB <- matrix(RGBAmx['blue',colorIndexes],nrow=y,ncol=x,byrow = TRUE)
colorIndexesA <- matrix(RGBAmx['alpha',colorIndexes],nrow=y,ncol=x,byrow = TRUE)
planes <- abind(colorIndexesR,colorIndexesG,colorIndexesB,colorIndexesA,along=3)
# write the PNG image
if(format[1] == 'png'){
writePNG(planes,destinationFile)
}else if(format[1] == 'tiff'){
writeTIFF(planes,destinationFile)
}else{
stop('usupported format')
}
# for debug purpose only we plot the image...
if(debugPlot){
mx <- matrix(colorIndexes,nrow=y,ncol=x,byrow = TRUE)
image(z=t(mx[nrow(mx):1,]),col=charToColorMap)
}
invisible()
}
使用方法:
# arbitrary and incomplete LETTER -> COLOR map
charToColorMap <- c(A='red',B='blue',C='green',D='black',E='yellow',F='orange')
txt <- "ABACDAAFFEDDADFAFAED"
createImage(txt,charToColorMap,destinationFile = "test.png",debugPlot=TRUE)
导致PNG图像(800%缩放看到像素):