gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:43:26 28 4
gpt4 key购买 nike

我想使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com