我需要一个图像的MIME类型和原始向量上传到我正在使用的API.我想用magick包来做这件事,但我不知道如何从一个神奇的物体中得到一个合适的原始向量.这就是我读入图片并获取MIME类型的方法:

library(magick)
example_image <- "https://i.stack.imgur.com/H5yfi.jpg?s=256&g=1"
img <- image_read(example_image)
image_mimetype <- paste0("image/", tolower(image_info(img)$format))
image_mimetype
#> [1] "image/jpeg"

我目前的解决方法(可行)是将magick对象保存到磁盘,并再次将文件作为原始文件读入:

tmp <- tempfile()
image_write(img, tmp)
img_raw <- readBin(tmp, "raw", file.info(tmp)$size)
head(img_raw)
#> [1] ff d8 ff e0 00 10
object.size(img_raw)
#> 24272 bytes

我在Magick GitHub repo中查找RAW的提法,发现您可以获得一个原始数组,如下所示:

img_raw <- img[[1]]
img_raw
#> 3 channel 256x256 bitmap array: 'bitmap' raw [1:3, 1:256, 1:256] 54 55 4d 4b ...

有可能把它变成一个向量:

img_raw <- as.raw(img[[1]])
head(img_raw)
#> [1] 54 55 4d 4b 4c 44
object.size(img_raw)
#> 196656 bytes

但该向量大约是jpeg的8倍,API不接受它为有效的jpeg.

创建于2024-01-16与reprex v2.0.2

推荐答案

函数image_write默默地返回你需要的信息,所以你不需要显式地将它写入文件(使用path=NULL),所以你可以替换

tmp <- tempfile()
image_write(img, tmp)
img_raw <- readBin(tmp, "raw", file.info(tmp)$size)

通过

img_raw <- image_write(img, NULL)

以避免写入文件并产生相同的输出.

我不确定文档中是否明确了这种行为,但您可以从image_write()的源代码中看到发生了什么.

R相关问答推荐

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

从开始时间和结束时间导出时间

如何按排序顺序打印一个框架中所有精确的唯一值?

如何利用模型函数在格图中添加双曲/指数曲线

将向量组合到一个数据集中,并相应地命名行

IMF IFS数据以R表示

使用范围和单个数字将数字与字符串进行比较

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

在R中创建连续的期间

在R中,如何将误差条放置在堆叠的每个条上?

使用R将简单的JSON解析为嵌套框架

在R中使用列表(作为tibble列)进行向量化?

如何计算每12行的平均数?

错误包arrowR:READ_PARQUET/OPEN_DATASET&QOT;无法反序列化SARIFT:TProtocolException:超出大小限制&Quot;

为什么函数toTitleCase不能处理english(1),而toupper可以?

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

如何将图例文本添加到图例符号中

在R中使用ggraph包排列和着色圆

随机生成样本,同时在R内的随机样本中至少包含一次所有值

将`magick`对象转换为原始向量