r - 使用 R 中的 jpeg 包检测无效或损坏的 jpg 文件

标签 r try-catch jpeg corrupt

我想使用 jpeg 包(或类似包)来检测损坏的 .jpg 文件。我正在与安装 exiftool 时遇到问题的用户分享此代码,因此我更愿意使用不需要该程序的软件包。

我希望我的代码能够捕获完全损坏或部分损坏的图像(即,您可以看到图像的一部分,但其中一些被截断了)。

当图像损坏时,readJPEG 函数返回:

Error in readJPEG(photos[35]) : 
  JPEG decompression error: Not a JPEG file: starts with 0x7b 0x28

当图像部分损坏时,函数返回:

JPEG decompression: Corrupt JPEG data: premature end of data segment

我想编写一个函数,如果图像“良好”则返回 FALSE,如果图像已损坏或部分损坏则返回 TRUE。到目前为止,如果图​​像部分损坏(它返回 FALSE),我无法让我的函数工作。我做错了什么?

Here's an example of a "partially corrupt" image - 下半部分在转移到新设备时被切断。

library(jpeg)

    # Function to "catch" bad photos
is_corrupted <- function(x){
  tryCatch({
    check <- readJPEG(x)
    return(FALSE)
    },
    error = function(e)
      return(TRUE),
    warning = function(w)
      return(TRUE),
    message = function(m)
      return(TRUE)
    )
}

编辑:尝试数字 2...

我根据 Ben 的建议创建了一个修改后的函数,但如果图像完全损坏,它仍然不会返回 TRUE。我也不喜欢它对照片进行两次测试的方式。任何建议表示赞赏!

要测试该功能,您可以使用三个 jpg...(1) 您计算机中的任何有效 jpg,(2) 此问题中链接的“部分损坏”文件,以及 (3) 引用一个不存在的文件不会抛出将被 tryCatch 捕获的错误(例如,is_corrupted("")

is_corrupted <- function(x){
message <- capture.output(check2 <- readJPEG(x), type = "message")
if(length(message) > 0) {
  corrupt <- TRUE
} else {
corrupt <- tryCatch({
    check <- readJPEG(x)
    return(FALSE)
  },
  error = function(e) # catch "corrupt" images
    return(TRUE)
  ) 
}
return(corrupt)
}

最佳答案

我同意,这个很棘手。我认为您需要在捕获部分之前进行错误检查。我将发布一个临时的(丑陋的)解决方案,并希望其他人发布一个更优雅、更直接的解决方案。

readJPEG2 <- purrr::safely(readJPEG)

purrr 进行错误检查,如果没有,则继续检查输出:

fun <- function(x){
          if(is.null(readJPEG2(x)$error)){
                    message2 <- capture.output(readJPEG(x), type = "message")
                    if(length(message2) > 0){
                              return("partially corrupted")
                    } else {
                              return("complete")
                    }
          } else {
                    return("corrupted")
          }

}

我不知道这个解决方案有多稳健,但也许它对你有帮助。

关于r - 使用 R 中的 jpeg 包检测无效或损坏的 jpg 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57613227/

相关文章:

r - 如何在 R 中更新到 SparkR 2.0.0 包

r - 你如何格式化多行 R 包消息?

ruby-on-rails-4 - Rails 电子邮件传送错误检查 - Deliver_now

python-3.x - Beautifulsoup 过滤器 "find_all"结果,仅限于通过 Regex 的 .jpeg 文件

java - 在 Java 中缩放图像/图标

r - 关于data.table 1.9.2的新特征J()

r - 从R中的函数绘制到文件

php - 如何使用 php 在浏览器中将 pdf 文件的 url 显示为 jpeg 图像?

java - 用户输入try&catch

java - 为什么我的代码绕过了 else if 语句?