Как изменить размер изображения без заливки фона цветом
У меня есть одна проблема при конвертации изображений JPEG в PHP.
Что я делаю?
У меня есть различные форматы изображений, и мне нужно изменить их размер в соответствии с контейнером, где он будет использоваться, например, в слайд-шоу.
Честно говоря, это стандартная реализация движка OpenCart. Что в этом плохого?
Когда я изменяю размер PNG, все работает идеально, и я получаю прозрачный фон.
Но когда я конвертирую изображения JPEG, я получаю фон, по умолчанию прямоугольник заполнен белым цветом. Я понимаю, что невозможно иметь JPEG с прозрачностью.
Результат, которого я хочу
Я хочу изменить размер изображений JPEG и скомпоновать их на прозрачный фон. Например, преобразовать и изменить размер JPEG, нарисовать прозрачный прямоугольник, поместить JPEG на этот прямоугольник и сохранить его в PNG или другой формат, который позволяет прозрачность.
Вот код::
$image_old = $this->image;
$this->image = imagecreatetruecolor($width, $height);
if (isset($this->info['mime']) && $this->info['mime'] == 'image/png') {
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
$background = imagecolorallocatealpha($this->image, 255, 255, 255, 127);
imagecolortransparent($this->image, $background);
} else {
$background = imagecolorallocate($this->image, 255, 255, 255);
}
imagefilledrectangle($this->image, 0, 0, $width, $height, $background);
imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0,
$new_width, $new_height, $this->info['width'], $this->info['height']);
imagedestroy($image_old);
Я пытался искать решения, читать руководства и документацию, но все мои попытки не увенчались успехом. (черный фон, плохое качество, но все еще заполненный фон)
Пожалуйста, помогите получить желаемый результат.
Спасибо всем за помощь и советы.





Ответы - Как изменить размер изображения без заливки фона цветом / How to resize image without filling background with color

28.04.2015 12:22:46
if(isset($_GET["path"]) && $_GET["path"] != "" && file_exists($_GET["path"])){
$path = $_GET["path"];
//getting extension type (jpg, png, etc)
$type = explode(".", $path);
$ext = strtolower($type[sizeof($type)-1]);
$ext = (!in_array($ext, array("jpeg","png","gif"))) ? "jpeg" : $ext;
//get image size
$size = getimagesize($path);
$width = $size[0];
$height = $size[1];
//get source image
$func = "imagecreatefrom".$ext;
$source = $func($path);
//setting default values
$new_width = $width;
$new_height = $height;
$k_w = 1;
$k_h = 1;
$dst_x =0;
$dst_y =0;
$src_x =0;
$src_y =0;
//selecting width and height
if(!isset ($_GET["width"]) && !isset ($_GET["height"]))
{
$new_height = $height;
$new_width = $width;
}
else if(!isset ($_GET["width"]))
{
$new_height = $_GET["height"];
$new_width = ($width*$_GET["height"])/$height;
}
else if(!isset ($_GET["height"]))
{
$new_height = ($height*$_GET["width"])/$width;
$new_width = $_GET["width"];
}
else
{
$new_width = $_GET["width"];
$new_height = $_GET["height"];
}
//secelcting_offsets
if($new_width>$width )//by width
{
$dst_x = ($new_width-$width)/2;
}
if($new_height>$height)//by height
{
$dst_y = ($new_height-$height)/2;
}
if( $new_width<$width || $new_height<$height )
{
$k_w = $new_width/$width;
$k_h = $new_height/$height;
if($new_height>$height)
{
$src_x = ($width-$new_width)/2;
}
else if ($new_width>$width)
{
$src_y = ($height-$new_height)/2;
}
else
{
if($k_h>$k_w)
{
$src_x = round(($width-($new_width/$k_h))/2);
}
else
{
$src_y = round(($height-($new_height/$k_w))/2);
}
}
}
$output = imagecreatetruecolor( $new_width, $new_height);
//to preserve PNG transparency
if($ext == "png")
{
//saving all full alpha channel information
imagesavealpha($output, true);
//setting completely transparent color
$transparent = imagecolorallocatealpha($output, 0, 0, 0, 127);
//filling created image with transparent color
imagefill($output, 0, 0, $transparent);
}
imagecopyresampled( $output, $source, $dst_x, $dst_y, $src_x, $src_y,
$new_width-2*$dst_x, $new_height-2*$dst_y,
$width-2*$src_x, $height-2*$src_y);
//free resources
ImageDestroy($source);
//output image
header('Content-Type: image/'.$ext);
$func = "image".$ext;
$func($output);
//free resources
ImageDestroy($output);
}
Попробуй вот это

26.03.2019 03:39:23
Вы можете использовать imagemagick, чтобы получить его.
Изменить размер изображения без черной границы, вы можете сделать это так:
convert in.jpg -resize 800x572 -background white -alpha remove -bordercolor black out.jpg