我需要将较大的(最大16384x16384像素)图像分割成较小的块,通常为512x512。为此,我使用下面的简单perl脚本:
#!/usr/bin/perl
use warnings;
use strict;
my $size = '512x512';
unless ($ARGV[0]) { die "Missing filename as arg" }
unless (-e $ARGV[0]) { die "$ARGV[0] not found.\n" }
my ($newfile, undef) = split(/\./,$ARGV[0]);
system("convert $ARGV[0] -crop $size $newfile" . "_%03d.png");
现在,问题是,我需要构建一个较小部分的索引,其中包括原始图像中的位置偏移,例如在1024x1024源图像的情况下:
image_000.png 0,0
image_001.png 512,0
image_002.png 0,512
image_003.png 512,512
......或类似的东西。基本上,只是为了跟踪每个特定块在原始图像中的位置。
由于convert
命令传递给system()
,我只想做一些文件并对它们进行排序,因为一些快速实验表明较小的块按从左到右的顺序编号,从上到下(直观地)并基于此构建索引,但我认为必须有一些更简单的涉及perls own interface to ImageMagick
所以我的问题是:
1。 Image::Magick
相当于convert $ARGV[0] -crop $size $newfile" . "_%03d.png
是什么?
2. 一旦我设法避免系统()调用,是否可以根据$ image对象的数据构建索引?
PS:
$size
中提取...实际上,我不知道为什么我选择拥有该变量。 identify
命令的第3列?答案 0 :(得分:0)
我解决了它唯一的方法我知道:螺旋perlmagic,并通过命令行来做。以下脚本适用于矩形和方形图像。索引将打印到屏幕上。
use warnings;
use strict;
my $size = '512x512';
my $offset = 512;
unless ($ARGV[0]) { die "Missing filename as arg" }
unless (-e $ARGV[0]) { die "$ARGV[0] not found.\n" }
my ($newfile, undef) = split(/\./,$ARGV[0]);
system("convert $ARGV[0] -crop $size $newfile" . "_%03d.png");
my @files = glob($newfile . "_*");
@files = sort(@files);
my (undef, undef, $origsize) = split(/\s+/,`identify $ARGV[0]`);
my ($maxX, $maxY) = split(/x/,$origsize);
$maxX /= $offset;
$maxY /= $offset;
my $x = 0;
my $y = 0;
foreach my $file (@files)
{
print "$file\t" . $x * $offset . "\t" . $y * $offset . "\n";
$x++;
if ($x >= $maxX)
{
$x = 0;
$y++;
}
}
__END__