Linux 在Perl中找到宽度和高度最小的jpg
我正在寻找一种方法来查找(1)宽度最小、高度最小的文件,并显示这些数字(最好是命令行,Linux或Windows)。我不知道该使用什么工具,但我认为Perl及其一个包可能具有这种功能 在Linux上,我只需要从命令行使用ImageMagick。您可能需要先安装它(例如,在Ubuntu上使用Linux 在Perl中找到宽度和高度最小的jpg,linux,windows,perl,Linux,Windows,Perl,我正在寻找一种方法来查找(1)宽度最小、高度最小的文件,并显示这些数字(最好是命令行,Linux或Windows)。我不知道该使用什么工具,但我认为Perl及其一个包可能具有这种功能 在Linux上,我只需要从命令行使用ImageMagick。您可能需要先安装它(例如,在Ubuntu上使用sudo apt get install imagemagick): 在Windows上,这不是一个选项,除非您安装Cygwin或其他东西 在Linux和Windows上,您都可以使用Image::Magick
sudo apt get install imagemagick
):
在Windows上,这不是一个选项,除非您安装Cygwin或其他东西
在Linux和Windows上,您都可以使用
Image::Magick
模块从Perl访问该功能,但您必须自己安装该模块。有关代码,请参见Borodin的答案。这里有一个完整的Perl程序,可以按照您的要求执行。您可能必须安装,因为它不是核心模块。目前,程序检查当前工作目录中以.jpg
结尾的所有文件。您可能需要将调用更改为glob
,以检查不同目录中的文件或具有不同文件类型的文件
use strict;
use warnings;
use Image::Magick;
my %data;
for my $jpg (glob '*.jpg') {
my $magick = Image::Magick->new;
$magick->Read($jpg);
$data{$jpg} = { map { $_ => $magick->Get($_) } qw/ width height / };
}
my ($least_width, $least_width_file);
my ($least_height, $least_height_file);
while (my ($jpg, $info) = each %data) {
unless ($least_width and $least_width <= $info->{width}) {
($least_width_file, $least_width) = ($jpg, $info->{width});
}
unless ($least_height and $least_height <= $info->{height}) {
($least_height_file, $least_height) = ($jpg, $info->{height});
}
}
print "\n";
printf "File with least width (%d) is %s\n", $least_width, $least_width_file;
printf "File with least height (%d) is %s\n", $least_height, $least_height_file;
更新 此版本根据要求向输出中添加一些统计信息。它使用模块更简洁地查找最小的文件。这不是核心模块,可能需要安装
use strict;
use warnings;
use Image::Size qw/ imgsize /;
use List::UtilsBy qw/ min_by /;
my %data;
for my $jpg (glob '*.jpg') {
@{ $data{$jpg} }{qw/ width height /} = imgsize($jpg);
}
my @least_width_files = min_by { $data{$_}{width} } keys %data;
my $least_width = $data{$least_width_files[0]}{width};
my @least_height_files = min_by { $data{$_}{height} } keys %data;
my $least_height = $data{$least_height_files[0]}{height};
print "\n";
if (@least_width_files == keys %data) {
printf "All files have a width of %d\n", $least_width;
}
else {
my $n = @least_width_files;
printf "%d file%s %s the least width of %d:\n", $n, $n == 1 ? ('', 'has') : ('s', 'have'), $least_width;
print " $_\n" for @least_width_files;
}
print "\n";
if (@least_height_files == keys %data) {
printf "All files have a height of %d\n", $least_height;
}
else {
my $n = @least_height_files;
printf "%d file%s %s the least height of %d:\n", $n, $n == 1 ? ('', 'has') : ('s', 'have'), $least_height;
print " $_\n" for @least_height_files;
}
我推荐该模块用于该任务。与像
image::Magick
这样的成熟的图像处理库相比,它不需要解压缩整个图像并将其读入内存来获取其大小。因此,它应该更快,内存消耗更少,特别是对于大型图像
应采取以下措施:
use strict;
use warnings;
use Image::Size;
my ($min_width, $min_height);
for my $filename (glob '*.jpg') {
my ($width, $height) = imgsize($filename);
$min_width = $width if !defined($min_width) || $width < $min_width;
$min_height = $height if !defined($min_height) || $height < $min_height;
}
if (defined($min_width) && defined($min_height)) {
print "Minimum width: $min_width\n";
print "Minimum height: $min_height\n";
}
else {
print "No images found\n";
}
使用严格;
使用警告;
使用图像::大小;
我的($minu-width,$minu-height);
对于我的$filename(glob'*.jpg'){
my($width,$height)=imgsize($filename);
$min_width=$width if!已定义($min_width)|$width<$min_width;
$min_height=$height if!已定义($min_height)| |$height<$min_height;
}
if(已定义($min_宽度)和已定义($min_高度)){
打印“最小宽度:$min\u宽度\n”;
打印“最小高度:$min\u高度\n”;
}
否则{
打印“未找到图像\n”;
}
谢谢!明天我将在Windows和Linux上检查它,并告诉您结果。如果您只关心图像大小,我发现它是一个非常优秀且更轻的模块。@nwellnhof:我认为您应该作为一个solution@Borodin您是否可以重写代码以使用Image::Size?我发现自己重写它非常困难,因为你的代码和nwekknhof的代码彼此非常不同。@Borodin你真是个天才!代码工作得很好。你挽救了我失去的一段时间!我不想贪心,但如果可以添加一段代码,说明所有文件都具有大小、宽度和高度,我会非常高兴。如果你认为这太过分了,那当然不会改变任何事情。你帮了大忙,真是太棒了!在Windows上安装Image::Magick时遇到问题。您的解决方案非常快速,并且能够完成任务。非常感谢!如果你能加两条线,我也会很感激。首先,脚本可以显示文件名(最小宽度和高度)。其次,所有文件都具有相同宽度和高度的信息(如果是这样的话)也很好。@menteith StackOverflow不是一个其他人免费解决您所有问题的网站。你问题的答案应该为你提供足够的细节来完成工作。谢谢。由于你的回答没有给出我在第一篇文章中要求的所有东西,我不能接受你的回答。
use strict;
use warnings;
use Image::Size qw/ imgsize /;
use List::UtilsBy qw/ min_by /;
my %data;
for my $jpg (glob '*.jpg') {
@{ $data{$jpg} }{qw/ width height /} = imgsize($jpg);
}
my @least_width_files = min_by { $data{$_}{width} } keys %data;
my $least_width = $data{$least_width_files[0]}{width};
my @least_height_files = min_by { $data{$_}{height} } keys %data;
my $least_height = $data{$least_height_files[0]}{height};
print "\n";
if (@least_width_files == keys %data) {
printf "All files have a width of %d\n", $least_width;
}
else {
my $n = @least_width_files;
printf "%d file%s %s the least width of %d:\n", $n, $n == 1 ? ('', 'has') : ('s', 'have'), $least_width;
print " $_\n" for @least_width_files;
}
print "\n";
if (@least_height_files == keys %data) {
printf "All files have a height of %d\n", $least_height;
}
else {
my $n = @least_height_files;
printf "%d file%s %s the least height of %d:\n", $n, $n == 1 ? ('', 'has') : ('s', 'have'), $least_height;
print " $_\n" for @least_height_files;
}
use strict;
use warnings;
use Image::Size;
my ($min_width, $min_height);
for my $filename (glob '*.jpg') {
my ($width, $height) = imgsize($filename);
$min_width = $width if !defined($min_width) || $width < $min_width;
$min_height = $height if !defined($min_height) || $height < $min_height;
}
if (defined($min_width) && defined($min_height)) {
print "Minimum width: $min_width\n";
print "Minimum height: $min_height\n";
}
else {
print "No images found\n";
}