доброго времени суток.
Ранее писал на php код, который берёт из одной папки все изображения, затем ресайзит их в зависимости что больше ширина или высота, а ещё вставляет водяной знак и новые сохраняет в новой папке.
Только этот скрипт не делает как Вы указываете - вставляет на белый фон, в зависимости от рамеров, при этом функции для того чтобы реализовать как Вам надо в коде есть. Сейчас недостаточно времени чтобы рассказать детальнее, поэтому если разбираетесь в php переделайте под себя(приведённых функций скорее всего достаточно).
По логике Вам потребуется: определить размеры исходного. В зависимости от них создать размер для нового. Далее отресайзить исходное. Рассчитать координаты для вставки в новое отресайзенного исходного.
Вот мой код как он был изначально:
<?php
function imageresize($outfile,$infile,$neww,$newh,$quality) {
$im=imagecreatefromjpeg($infile);
$x = imagesx($im);
$y = imagesy($im);
if (($x < 200) and ($y < 200)) {
return true;
}
if (($x < $neww) and ($y < $newh)) {
$neww = $x;
$newh = $y;
}
$ko = $neww / $x;
$xx = $x;
$yy = $y;
if (($x != $neww) or ($y != $newh)) {
$xx = $neww;
$yy = round($y * $ko);
if ($yy > $newh) {
$yy = $newh;
$ko = $newh / $y;
$xx = round($x * $ko);
}
}
$im1=imagecreatetruecolor($xx,$yy);
imagecopyresampled($im1,$im,0,0,0,0,$xx,$yy,imagesx($im),imagesy($im));
// работа с водным знаком
$wm=imagecreatefrompng('vznak.png');
$wmW=imagesx($wm);
$wmH=imagesy($wm);
$cx = $xx - $wmW - 20;
$cy = $yy - $wmH - 20;
imagecopyresampled ($im1, $wm, $cx, $cy, 0, 0, $wmW, $wmH, $wmW, $wmH);
imagejpeg($im1,$outfile,$quality);
imagedestroy($im);
imagedestroy($im1);
imagedestroy($wm);
}
foreach (glob("img/*") as $file) {
$file = basename($file);
// $fileto = "newimg/$file";
$fileto = "newimg/" . strtolower($file);
$userfile = "img/$file";
if (imagecreatefromjpeg($userfile)) {
echo "
\n";
imageresize($fileto,$userfile,800,600,85);
} else {
echo "bad - $userfile
\n";
}
}