要执行无损JPEG裁剪,可以使用
jpegtran格式
,作为
IJG
library
例如,以下命令从768x512图像中删除最后一列像素:
jpegtran -crop 767x512+0+0 -optimize image.jpg >image.jpg
这个
-crop
开关指定矩形分区
WxH+X+Y
和
-optimize
是一种通过优化哈夫曼表来减少文件大小而不损失质量的选项。有关交换机的完整列表,请参见
jpegtran -help
.
一旦
jpegtran格式
安装在您的系统上,可以通过从R调用
system()
。以下示例首先获取一个示例图像,并将其保存为JPEG。然后对图像进行裁剪,并将像素值与原始图像中的值进行比较。
library("EBImage")
# resave a sample image as JPG
f = system.file("images", "sample.png", package="EBImage")
writeImage(readImage(f), "image.jpg", quality=90)
# do the cropping
system("jpegtran -crop 767x512+0+0 -optimize image.jpg >cropped.jpg")
# compare file size
file.size("image.jpg", "cropped.jpg")
## [1] 65880 65005
original = readImage("image.jpg")
dim(original)
## [1] 768 512
cropped = readImage("cropped.jpg")
dim(cropped)
## [1] 767 512
# check whether original values are retained
identical(original[1:767,], cropped)
## TRUE
回到您的具体用例:您的脚本可以通过检查图像尺寸进一步改进,而无需实际将整个像素数组加载到R中
RBioFormats
仅将包含图像尺寸的图像元数据读取到R中。但您也可以使用另一个命令行工具
识别
作为
图像Magick
套件检索图像尺寸,如下所示。
path = "G:/Images/"
file.names = dir(path, full.names = TRUE, pattern =".jpeg")
reqd_dim = c(3099,2329,3)
cat(sprintf("Number of Image Files is: %d\n", length(file.names)))
for (i in seq_along(file.names)) {
file = file.names[i]
cat(sprintf("Checking dimensions of image number %d: ", i))
flush.console()
cmd = paste('identify -format "c(%w, %h)"', file)
res = eval(parse(text=system(cmd, intern=TRUE)))
# Checking if the dimensions are the same
if ( all(res==reqd_dim) ) {
cat("OK\n")
flush.console()
}
else {
cat("Correcting\n")
flush.console()
system(sprintf("jpegtran -crop %dx%d+0+0 -optimize %s >%s",
reqd_dim[1], reqd_dim[2], file, file))
}
}