2014-10-31 78 views
0

我正在尋找一種方法來查找(1)具有最小寬度和(2)最小高度的文件,並顯示這些數字(最好是命令行,Linux或Windows)。我不知道要使用什麼工具,但我認爲Perl的一個包可能具有這種功能。在Perl中查找具有最小寬度和高度的jpg

回答

0

下面是一個完整的Perl程序,可以按照您的要求進行操作。您可能必須安裝Image::Magick,因爲它不是核心模塊。就目前而言,程序將檢查當前工作目錄中結尾爲.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; 

更新

,關注@ nwellnhof的建議,並使用Image::Size代替Image::Magick,則應更換use語句和for循環用下面的代碼。

use Image::Size qw/ imgsize /; 

my %data; 
for my $jpg (glob '*.jpg') { 
    @{ $data{$jpg} }{qw/ width height /} = imgsize($jpg); 
} 

更新

該版本增加了一些統計信息輸出的要求。它使用List::UtilsBy模塊來更簡潔地查找最小的文件。這不是一個核心模塊,可能需要安裝。

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; 
} 
+0

感謝!我將在明天在Windows和Linux上檢查並告訴結果。 – menteith 2014-11-01 20:07:34

+1

如果你只關心圖像大小,我發現['Image :: Size'](https://metacpan.org/pod/Image::Size)是一個優秀的,更輕量級的模塊。 – nwellnhof 2014-11-02 12:48:11

+0

@nwellnhof:我認爲你應該把它寫成解決方案 – Borodin 2014-11-02 13:42:55

1

在Linux上,我只是從命令行使用ImageMagick。您可能需要(例如用在sudo apt-get install imagemagick Ubuntu的),先安裝它:

narrowest=$(identify *jpg | sort -nr -k3 | tail -n 1 | cut -d\[ -f1) 
shortest=$(identify *jpg | sort -tx -nr -k2 | tail -n 1 | cut -d\[ -f1) 

在Windows上,這不是除非你安裝Cygwin或東西的選項。

在Linux和Windows上,您都可以使用Image::Magick模塊從Perl訪問該功能,但您必須自己安裝該模塊。請參閱Borodin的代碼答案。

+1

在Perl中,你可以使用[圖像:: Magick(http://p3rl.org/Image::Magick)。 – choroba 2014-10-31 20:46:50

1

我會爲該任務推薦模塊Image::Size。與像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"; 
} 
+0

很棒!我在Windows上安裝Image :: Magick時遇到了問題。你的解決方案非常快,並且完成這項工作。非常感激! – menteith 2014-11-02 17:56:39

+0

我也很感激,如果你可以添加兩個twings。首先,腳本可以顯示文件的名稱(最小寬度和最高)。其次,所有文件具有相同寬度和高度(如果是這種情況)的信息也會非常好。 – menteith 2014-11-02 18:03:31

+0

@menteith StackOverflow不是其他人可以免費解決所有問題的網站。你的問題的答案應該爲你提供足夠的細節來完成工作。 – nwellnhof 2014-11-02 21:04:41

相關問題