Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在Perl中找到宽度和高度最小的jpg_Linux_Windows_Perl - Fatal编程技术网

Linux 在Perl中找到宽度和高度最小的jpg

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

我正在寻找一种方法来查找(1)宽度最小、高度最小的文件,并显示这些数字(最好是命令行,Linux或Windows)。我不知道该使用什么工具,但我认为Perl及其一个包可能具有这种功能

在Linux上,我只需要从命令行使用ImageMagick。您可能需要先安装它(例如,在Ubuntu上使用
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";
}