如何在 R 中将矩阵写为原始位图

How do I write a matrix as a raw bitmap in R

不是问题:
有很多人问 "how do I save a figure" 的变体,其中图形有边框、注释和样式;我不是在寻找任何东西,因为我可以在 base、lattice 或 ggsave 中做到这一点。如果您需要我,那么我可以列出 20 个 SO 问题,这与此不同。

tl;dr
我想要一个位图文件,其中我的矩阵是值。在 python 中,使用 OpenCV 我可以读取矩阵,像素 [1,1] 将具有特定值。如果我改变它并保存它,那么强度值就会改变。我如何获得它?

详情:
当我 运行 此代码时:

set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
image(img_data)

我得到这张图片:

您可以看到默认注释。可以删除注释。

set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
image(img_data, xaxt='n',yaxt='n')

这看起来不那么糟糕了。

但是用mspaint打开,显示问题。

问题:

我想要一张228x228的图片,图片的值[1,1]就是矩阵的值[1,1]。

如何在 base、lattice、ggplot 或其他 R 语言中做到这一点?

更新:
这几乎有效。

set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)

mar_old <- par("mar")  #lets not permanently change values 
xpd_old <- par("xpd")  #lets not permanently change values 

bmp(filename = "mytest.bmp", width = 227, height = 228, units = "px")

par(mar=rep(0, 4), xpd = NA) 

image(img_data, bty ="n",axes=F,frame.plot=F, xaxt='n', ann=FALSE, yaxt='n', asp=1)
dev.off()

par(mar=mar_old, xpd=xpd_old)

它使这个图像

在mspaint中查看时,仍然在右侧和下边缘留下一条白线。

也许位图从零开始计数??

更新2:

这几乎行得通,而且可能是我不得不接受的。

library(magick)

set.seed(1)
img_data <- array(sample(x = 0:255, size = 228*228*3,replace = T),dim = c(228,228,3))

img <- magick::image_read(img_data/255)
image_write(img, path = "mystes3.bmp", format = "bmp")

它给出了这个:

并且在 mspaint 中:

它必须有 3 层,RGB (rgba?),才能转换。这意味着它是一个 3d 数组而不是 2d 矩阵。它的大小合适,因为它不添加填充。

您需要在image()中将useRaster参数设置为TRUE:

set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)

mar_old <- par("mar")  #lets not permanently change values 
xpd_old <- par("xpd")  #lets not permanently change values 

bmp(filename = "mytest.bmp", width = 228, height = 228, units = "px")

par(mar=rep(0, 4), xpd = NA) 

image(img_data, bty ="n",axes=F,frame.plot=F, xaxt='n', ann=FALSE, yaxt='n', asp=1, useRaster = T)
dev.off()

par(mar=mar_old, xpd=xpd_old)

我还将高度从 227 改成了 228。

做了小图:

useRaster = T

没有useRaster:

没有 useRaster 你甚至会丢失一行和一列。