Константин Матыцын
86 сообщений
#16 лет назад
На досуге появилось желание сделать ресайзер. Вот интересно, как можно реализовать ресайз с определенной шириной и автоматически подстраиваемой под нее высотой.

Сейчас есть конструкция вида:


$size = getimagesize(SOURCE);


define('NEWX', $size/2); // ширина "превьюшки"
define('NEWY', $size/2 ); // высота "превьюшки"

$source = imagecreatefromjpeg(SOURCE);


// Создаем новое изображение


$target = imagecreatetruecolor(NEWX, NEWY);


// Копируем существующее изображение в новое с изменением размера:


imagecopyresampled(


$target, // Идентификатор нового изображения


$source, // Идентификатор исходного изображения


0,0, // Координаты (x,y) верхнего левого угла


// в новом изображении


0,0, // Координаты (x,y) верхнего левого угла копируемого


// блока существующего изображения


NEWX, // Новая ширина копируемого блока


NEWY, // Новая высота копируемого блока


$size, // Ширина исходного копируемого блока


$size // Высота исходного копируемого блока


);


однако делается лишь масштабирование... а как сделать выбранную ширину и автоматическую высоту?
Царик Е.
193 сообщения
#16 лет назад
Если у вас имеется ширина превью и ширина исходной картинки, то посчитайте каков процент составляет ширина превью от исходника, и в этом же процентном соотношении посчитайте высоту от исходной. Должно сработать.
Андрей К.
1172 сообщения
#16 лет назад
$image_new_x=$width;
$image_new_y=floor($image_y*$image_new_x/$image_x);
Тут М.
626 сообщений
#16 лет назад
Perl + GD

sub resize_img {
my $jpeg_quality = 60; #Quality
my $max_sizex;
my $max_sizey;
my ( $img, $x, $y ) = @_;

GD::Image->trueColor(1);
my $bildle = GD::Image->new( $img );
my ( $width, $height ) = $bildle->getBounds();
$max_sizex = $width / $x;
$max_sizey = $height / $y;

if ( $max_sizex > $max_sizey ) {
$x = $width / $max_sizex;
$y = $height / $max_sizex;
} else {
$x = $width / $max_sizey;
$y = $height / $max_sizey;
}

my $bild=GD::Image->new( $x, $y, 1 );
$bild->copyResampled($bildle,0,0,0,0,$x,$y,$width,$height);
$bild->interlaced('true');
return $bild->jpeg($jpeg_quality);
}
Сергей К.
1649 сообщений
#16 лет назад
А можно это как то на ASP делать? Или как то подключить в ASP функцию PHP.
Роман А.
2 сообщения
#16 лет назад
Я использую такую пхп функцию в фотогалерее на пхп
function create_tmb($bigimgsrc,$trumbalis)
{
$rgb = 0xFFFFFF;


$quality = 100;


$size = @getimagesize($bigimgsrc);
$maxsize = 130;


$format = strtolower(substr($size, strpos($size, '/')+1));


$icfunc = "imagecreatefrom" . $format;


if (!function_exists($icfunc)) return false;


$x_gut = 0;


$y_gut = 0;
$ratio = $size/$size;


# для вертикальных исходников


if ($ratio < 1) {
$width = $maxsize*$ratio;
$height = $maxsize; }


# для горизонтальных исходников


else {
$height = $maxsize/$ratio;
$width = $maxsize; }


$x_proporcia = $size/$width;


$y_proporcia = $size/$height;


$actual_height = (($x_proporcia*$height) < $size) ? $x_proporcia*$height : $size;


$actual_width = (($y_proporcia*$width) < $size) ? $y_proporcia*$width : $size;


$bigimg = $icfunc($bigimgsrc);


$trumbcreate = imagecreatetruecolor($width, $height);


# $trumbcreate = imagecreatefrompng('modules/photocompetition/ramka.png');


imagecopyresampled($trumbcreate, $bigimg, 0, 0, 0, 0, $width, $height, $actual_width, $actual_height);


imagejpeg($trumbcreate,$trumbalis,$quality);


imagedestroy($bigimg);


imagedestroy($trumbcreate);


return true;
}