Некоторое время назад, не помню какими путями (скорее всего через фликер) я ане сделал обоину для твиттера, и решил сделать подобную для канала на ютуб. Через что делал я прошлый раз уже и не помню, вероятнее всего это был фликер или около того, но мне такое дело ломает грузить куда то кучу фоток и наваял по быстрому скриптец, как итог, залил туды свыше полутыщи фотографий, но на мелких смотреть не ахти. В конце концов сделал 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 задаём ширину картинки. Из папки берутся все файлы, мешаются, берётся число что бы можно было построить квадрат, после чего мы перебираем все фотографии и уменьшаем меньшую сторону до длины и обрезаем квадрат к центру.