Генератор картинок

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *