如何在R中读取多个PNG文件并编织为PDF,解决readPNG格式报错问题
PNG读取报错解决与PDF合并方案
Error in png::readPNG(path, native = TRUE, info = TRUE) : file is not in PNG format 报错的核心原因是读取的文件不符合PNG格式规范,通常由扩展名与实际格式不匹配、文件损坏、路径异常三类问题导致,可按以下步骤解决:
第一步:批量验证PNG文件有效性
运行以下R代码筛选出不符合PNG规范的文件:
# 替换为你的PNG文件所在文件夹路径 png_dir <- "替换为你的文件夹路径" png_paths <- list.files(png_dir, pattern = "\\.png$", full.names = TRUE) # 校验PNG文件头的工具函数 check_png_valid <- function(file_path) { con <- file(file_path, "rb") file_header <- readBin(con, "raw", n = 8) close(con) # PNG标准文件头固定为8字节十六进制值 return(identical(file_header, as.raw(c(0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A)))) } # 输出无效文件列表 invalid_files <- png_paths[!sapply(png_paths, check_png_valid)] print("无效PNG文件列表:") print(invalid_files)
- 如果输出了无效文件:优先从原始绘图R脚本重新导出这些文件,导出时明确指定
device = png;如果是扩展名误写(比如实际为JPG格式),修改为对应扩展名后用jpeg::readJPEG读取即可 - 如果没有无效文件,继续下一步排查路径问题
第二步:排查路径异常
- 检查文件路径是否包含中文、空格、特殊字符,部分系统环境下
png包无法识别非ASCII编码的路径,可将所有PNG文件移动到纯英文无特殊符号的文件夹下重试 - 升级
png包到最新版本:运行install.packages("png")重新安装即可
第三步:批量合并为PDF(每页1-2张图)
推荐以下两种稳定方案,按需选择:
方案1:RMarkdown编织(排版灵活,兼容性好)
新建后缀为.Rmd的文件,写入以下内容后点击编织即可生成PDF:
--- title: "绘图结果汇总" output: pdf_document: latex_engine: xelatex --- ```{r, echo=FALSE, fig.align='center', fig.height=7, fig.width=10} library(knitr) # 此处替换为你筛选后的有效PNG路径列表 valid_pngs <- png_paths[sapply(png_paths, check_png_valid)] # 调整分母控制每页图片数量:1=每页1张,2=每页2张 img_groups <- split(valid_pngs, ceiling(seq_along(valid_pngs)/2)) for (group in img_groups) { print(include_graphics(group, dpi = 300)) cat("\\newpage\n") }
### 方案2:纯R脚本生成(无需RMarkdown环境) ```r library(png) library(grid) # 替换为筛选后的有效PNG路径列表 valid_pngs <- png_paths[sapply(png_paths, check_png_valid)] # 打开PDF输出设备,可自定义宽高 pdf("绘图结果汇总.pdf", width = 10, height = 14) # 每页放2张图的布局,每页1张可删除该行 par(mfrow = c(2, 1), mar = rep(0, 4)) for (i in seq_along(valid_pngs)) { img <- readPNG(valid_pngs[i], native = TRUE) grid.raster(img) # 每2张图插入分页符,每页1张可改为每1张就分页 if (i %% 2 == 0) plot.new() } dev.off()
内容的提问来源于stack exchange,提问作者Diego d
相关产品推荐
相关产品推荐

