Обрезка изобажений в imagemagick

12
[Удален]
2187

Подскажите, как за один шаг сделать превью четко заданного размера (к примеру 50x50) с помощью imagemagick? Сейчас делаю это за два хода, сначала ресайзю до приблизительного размера (к примеру 70x70, ибо сохраняя пропорции утилита не дает точно заданных размеров), а потом кропом обрезаю до желанных и точных 50x50.

DA
На сайте с 04.02.2005
Offline
165
#1

покажите текущий код

тыщ-пыщ
wdsg
На сайте с 09.02.2009
Offline
31
#2

Hekcfy, будьте добры, хотя бы язык, на котором пишете, сообщите...

Проектирование и разработка сложных IT-систем. Вожусь с проблемными задачами.
[Удален]
#3
Hekcfy:
Подскажите, как за один шаг сделать превью четко заданного размера (к примеру 50x50) с помощью imagemagick? Сейчас делаю это за два хода, сначала ресайзю до приблизительного размера (к примеру 70x70, ибо сохраняя пропорции утилита не дает точно заданных размеров), а потом кропом обрезаю до желанных и точных 50x50.

Забей на imagemagick

вот те функция GD

function save_thumbnail($img_blob, $save_folder, $file_name, $width, $height, $bg_colour = '0xffffff') {
$img_buf_gd = imagecreatefromstring ( $img_blob );
if (! $img_buf_gd)
return false;
$img_final_gd = imagecreatetruecolor ( $width, $height );
imagepalettecopy ( $img_final_gd, $img_buf_gd );
$src_width = imagesx ( $img_buf_gd );
$src_height = imagesy ( $img_buf_gd );
$multiplier = min ( $src_width / $width, $src_height / $height );
$new_width = $width * $multiplier;
$new_height = $height * $multiplier;
$new_x = ($src_width - $new_width) / '2';
$new_y = ($src_height - $new_height) / '2';
$new_thumb_x = '0';
$new_thumb_y = '0';
$new_thumb_width = $width;
$new_thumb_height = $height;
imagecopyresampled ( $img_final_gd, $img_buf_gd, ( int ) $new_thumb_x, ( int ) $new_thumb_y, ( int ) $new_x, ( int ) $new_y, ( int ) $new_thumb_width, ( int ) $new_thumb_height, ( int ) $new_width, ( int ) $new_height );
imagedestroy ( $img_buf_gd );
if (strncmp ( $img_blob, "яШя", '3' ) == '0') {
$ret = imagejpeg ( $img_final_gd, $save_folder . $file_name . '.jpg' );
imagedestroy ( $img_final_gd );
unset ( $img_blob );
if ($ret)
return $save_folder . $file_name . '.jpg';
else
return false;
} else if (strncmp ( $img_blob, "GIF", '3' ) == '0') {
$ret = imagegif ( $img_final_gd, $save_folder . $file_name . '.gif' );
imagedestroy ( $img_final_gd );
unset ( $img_blob );
if ($ret)
return $save_folder . $file_name . '.gif';
else
return false;
} else if (strncmp ( $img_blob, "‰PNG", '4' ) == '0') {
$ret = imagepng ( $img_final_gd, $save_folder . $file_name . '.png' );
imagedestroy ( $img_final_gd );
unset ( $img_blob );
if ($ret)
return $save_folder . $file_name . '.png';
else
return false;
}
return false;
}

использование

save_thumbnail ( изображение, папка, имя файла на выходе, ширина, высота );

Юзаю везде её. Длеает кропинг сама, тоесть делает ресайз с сохранением всех пропорций.

AS
На сайте с 01.07.2003
Offline
135
#4

Немного не понятно но использованию

save_thumbnail ( изображение, папка, имя файла на выходе, ширина, высота );

тут путь к изображению ? $image_path ?

DA
На сайте с 04.02.2005
Offline
165
#5

function ResizeImagePoBokam($image_from,$image_to, $fitwidth=450,$fitheight=450,$quality=75){
$size=GetImageSize($image_from);
$i = ImageCreateFromJPEG($image_from);
$o = ImageCreateTrueColor($fitwidth, $fitheight);
if(!$o) $o=ImageCreate($fitwidth, $fitheight);
$white = imagecolorallocate($o, 255, 255, 255);
imagefilledrectangle($o,0,0,$fitwidth,$fitheight,$white);
$otn=$size[1]/$fitheight;
$copy_x=round($size[0]/$otn);
if($copy_x>$fitwidth)$copy_x=$fitwidth;
$copy_y=round($size[1]/$otn);
$width_w=round($copy_x*$otn);
$width_h=round($copy_y*$otn);
$start_x=floor($size[0]/2)-floor($width_w/2);
$start_y=floor($size[1]/2)-floor($width_h/2);
$dst_x=round(($fitwidth-$copy_x)/2);
imagecopyresampled($o,$i,$dst_x,$dst_y,$start_x,$start_y,$copy_x,$copy_y,$width_w,$width_h);
@unlink($image_to);
imagejpeg($o, $image_to, $quality);
imagedestroy($o);
imagedestroy($i);
}
// Схема зызова: ResizeImagePoBokam($файл_источник,$куда_сохранить(можно перезаписать источник),$ширина,$высота,$джыпег качество);

Хотя, автор наверно хочет перейти от MagickImageResize + MagickImageCrop к мифическому MagickCopyResampled

[Удален]
#6

allStars делаешь например


$image = file_get_contents ('http://img.searchengines.ru/logo1.gif')
if(($img = save_thumbnail ( $image, 'uploads/', 'searchengines', '150', '120' ))){
echo '<img src="'.$img.'">';
}

Skom
На сайте с 02.12.2006
Offline
165
#7

php

$s=50; // ну, к примеру

Это если стоит MagickWand.


$handle=MagickTransformImage( $handle, NULL,$s."x".$s);

Если стоит Imagick, то


imagick_resize($handle,$s,$s,IMAGICK_FILTER_UNKNOWN,1,"");

Если картинко не квадратное, то до 50 отресайзит наибольший размер.

Cras amet qui numquam amavit quique amavit cras amet
AS
На сайте с 01.07.2003
Offline
135
#8

Спасибо всем, собрал сборник из примеров :)

еще как бы ватермарк/лого приклеить на фото?

DA
На сайте с 04.02.2005
Offline
165
#9


function InsertLogo($file_from,$file_to,$q=70,$place=1) {
$logo_places = array(
1=>array(text => "верх - слева", x => 0, y => 0),
2=>array(text => "верх - справа", x => 1, y => 0),
3=>array(text => "низ - слева", x => 0, y => 1),
4=>array(text => "низ - справа", x => 1, y => 1),
);

$logo_file="/home/user/mega_logo_png.png";
$kx = $logo_places[$place][x];
$ky = $logo_places[$place][y];
$logo = ImageCreateFromPNG($logo_file);
$a1= GetImageSize($logo_file);
$a2 = GetImageSize($file_from);
$fr = ImageCreateFromJPEG($file_from);
$f=ImageCreateTrueColor(imagesx($fr),imagesy($fr));
ImageCopy($f,$fr,0,0,0,0,imagesx($fr),imagesy($fr));
ImageDestroy($fr);
ImageAlphaBlending($f, 1);
ImageAlphaBlending($logo, 1);
ImageCopy($f, $logo, $kx * ($a2[0] - $a1[0]) + 2 * (0.5 - $kx), $ky * ($a2[1] - $a1[1]) + 2 * (0.5 - $ky), 0, 0, $a1[0], $a1[1]);
if(file_exists($file_to))unlink($file_to);
ImageJPEG($f,$file_to,$q);
chmod($file_to,0777);
}
// СХЕМА ВЫЗОВА (источник, куда сохранить, джыпег качество, положение лого);

Не помню точно, но вроде лого должно быть сделано в PNG24, чтобы работала альфа-прозрачность

Skom
На сайте с 02.12.2006
Offline
165
#10
allStars:
Спасибо всем, собрал сборник из примеров :)
еще как бы ватермарк/лого приклеить на фото?

Ну, если тупо в лоб, то:

$Imagesource="image.jpg";

$Watermarksource="wm.png";

$handle = NewMagickWand();
$wm = NewMagickWand();

MagickReadImage($handle,$Imagesource);
MagickReadImage($wm,$atermarksource);

@MagickCompositeImage($handle, $wm, MW_SrcOverCompositeOp, $y, $x);

$x и $y от каких точек лепить.

Естественно, опущены всякие подгонки/ресайзы и причие плюшки.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий