Некоторое время назад, не помню какими путями (скорее всего через фликер) я ане сделал обоину для твиттера, и решил сделать подобную для канала на ютуб. Через что делал я прошлый раз уже и не помню, вероятнее всего это был фликер или около того, но мне такое дело ломает грузить куда то кучу фоток и наваял по быстрому скриптец, как итог, залил туды свыше полутыщи фотографий, но на мелких смотреть не ахти. В конце концов сделал 9х9 по 100px (кликабельно).
Исходный код
#!/usr/bin/perl
use strict;
use Image::Magick;
use Data::Dumper;
my $length = 100;
my @files = sort { int(rand(100)) < => int(rand(100)) } glob('./img/*');
my $cnt = int(sqrt(@files));
@files = splice(@files,0,$cnt*$cnt);
my $sx = $length*$cnt;
my $img = Image::Magick->new(magick => 'png');
$img->Set(size=>"${sx}x${sx}");
$img->ReadImage('xc:transparent');
my ($ax, $ay) = (0,0);
foreach my $file (@files)
{
my $im = Image::Magick->new();
$im->Read( $file );
$im->AutoOrient;
my ($ix, $iy) = $im->Get('columns','rows');
if ($ix > $iy)
{
$ix /= $iy/$length;
$iy = $length;
}
else
{
$iy /= $ix/$length;
$ix = $length;
}
$im->Resize( width => $ix, height => $iy);
$im->Crop(
geometry => sprintf( "%dx%d+%d+%d",
$length,
$length,
$ix>$length?int(($ix-$length)/2) : 0,
$iy>$length?int(($iy-$length)/2) : 0,
)
);
($ix, $iy) = $im->Get('columns','rows');
print "${ax}x${ay}: $ix, $iy\n";
$img->Composite(image => $im, compose => 'Over', 'x' => $ax, 'y' => $ay);
$ax += $length;
if ($ax >= $sx) { $ax = 0; $ay += $length}
}
my $filename = "img.png";
open IMAGE, ">$filename" or die "$! $filename";
$img->Write(file => \*IMAGE, filename => $filename);
close(IMAGE);
Фотографии складываем в папочку ./img на выходе получаем img.png в $length задаём ширину картинки. Из папки берутся все файлы, мешаются, берётся число что бы можно было построить квадрат, после чего мы перебираем все фотографии и уменьшаем меньшую сторону до длины и обрезаем квадрат к центру.
