假设我有这个image:
我想将灰度转换为绿颜色模式并保存。我已经使用下面的代码工作了:
system('wget https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Von_einem_Schrecklichen_vnd_Wunderbarlichen_Cometen_so_sich_den_Dienstag_nach_Martini_dieses_lauffenden_M._D._Lxxvij._Jahrs_am_Himmel_erzeiget_hat_%28grayscale%29.png/320px-thumbnail.png')
library(png)
library(viridisLite)
x <- png::readPNG('320px-thumbnail.png')
x <- x[, ,1]
intmat <- x * 255
image(1:nrow(intmat), 1:ncol(intmat), intmat, col=viridis(256))
导致的结果:
我对颜色模式的应用感到非常满意。但是,这不再是原始图像,而只是一个情节。我想要的是交换灰度中的每个像素,然后将转换后的图像再次保存为png,因此无需使用image()
。我看了magick中的image_convert
函数,但无法弄清楚如何获得所需的行为。
我敢肯定,有很多方法可以在不重新设计轮子的情况下进行,但是仅使用您已加载的库,就可以很容易地操作出绿色的颜色,将它们分成3个通道并另存为png。
这里有一个功能可以完成任何png的工作:
png_to_viridis <- function(in_file, out_file)
{
PNG_raw <- readBin(in_file, "raw", 10e6)
x <- png::readPNG(PNG_raw)
intmat <- 255 * x[, ,1]
virmat <- viridisLite::viridis(256)[intmat + 1]
virmat <- c(substr(virmat, 2, 3), substr(virmat, 4, 5),
substr(virmat, 6, 7), substr(virmat, 8, 9))
virmat <- as.numeric(as.hexmode(virmat))/255
dim(virmat) <- c(dim(intmat), 4)
png::writePNG(virmat, out_file)
}
现在就这样:
png_to_viridis("https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Von_einem_Schrecklichen_vnd_Wunderbarlichen_Cometen_so_sich_den_Dienstag_nach_Martini_dieses_lauffenden_M._D._Lxxvij._Jahrs_am_Himmel_erzeiget_hat_%28grayscale%29.png/320px-thumbnail.png",
"viridis.png")
我将以下结果另存为viridis.png: