Php 图片只调整宽度,自动调整高度
Php image resize only width, auto-adjusting the height
有一个系统可以使用 php 重塑图像。我设置宽度值。我希望它自动获取高度值。在当前形式中,某些图像的右侧有白色 space。我怎么能失去这个space。我想让高度值自动缩放。
public function resize(int $width = 0, int $height = 0, $default = '') {
if (!$this->width || !$this->height) {
return;
}
$xpos = 0;
$ypos = 0;
$scale = 1;
$scale_w = $width / $this->width;
$scale_h = 1;
if ($default == 'w') {
$scale = $scale_w;
} elseif ($default == 'h') {
$scale = $scale_h;
} else {
$scale = min($scale_w, $scale_h);
}
if ($scale == 1 && $scale_h == $scale_w && ($this->mime != 'image/png' && $this->mime != 'image/webp')) {
return;
}
$new_width = (int)($this->width * $scale);
$new_height = (int)($this->height * $scale);
$xpos = 0;
$ypos = 0;
$image_old = $this->image;
$this->image = imagecreatetruecolor($width, $new_height);
if ($this->mime == 'image/png') {
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
$background = imagecolorallocatealpha($this->image, 255, 255, 255, 127);
imagecolortransparent($this->image, $background);
} else if ($this->mime == 'image/webp') {
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, $new_height, $background);
imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->width, $this->height);
imagedestroy($image_old);
$this->width = $width;
$this->height = $new_height;
}
您很可能缺少 $default
参数,它应该是 'w'
。
举个例子:
假设您有一张 128 x 128 的图片,想将其调整为 256(宽度),则应将其放大至 256 x 256。调用如下所示:
查看调整比例的计算方式:
$scale_w = $width / $this->width; // 256 / 128 = 2
$scale_h = 1;
if ($default == 'w') {
$scale = $scale_w; // = 2
} elseif ($default == 'h') {
$scale = $scale_h; // = 1
} else {
$scale = min($scale_w, $scale_h); // = 1
}
没有 'w'
标志 $scale
变为 1
并且带有 'w'
标志它变为 2
- 预期值。
算法稍后多次使用 $width
而不是 $new_width
因此新图像将是 256w x 128h 而不是 128 x 128,因为这条线:
$this->image = imagecreatetruecolor($width, $new_height);
但是 imagecopyresampled
使用 $new_width
所以你最终得到一个 256w x 128h 的图像,包含原始的 128 x 128 图像。
有一个系统可以使用 php 重塑图像。我设置宽度值。我希望它自动获取高度值。在当前形式中,某些图像的右侧有白色 space。我怎么能失去这个space。我想让高度值自动缩放。
public function resize(int $width = 0, int $height = 0, $default = '') {
if (!$this->width || !$this->height) {
return;
}
$xpos = 0;
$ypos = 0;
$scale = 1;
$scale_w = $width / $this->width;
$scale_h = 1;
if ($default == 'w') {
$scale = $scale_w;
} elseif ($default == 'h') {
$scale = $scale_h;
} else {
$scale = min($scale_w, $scale_h);
}
if ($scale == 1 && $scale_h == $scale_w && ($this->mime != 'image/png' && $this->mime != 'image/webp')) {
return;
}
$new_width = (int)($this->width * $scale);
$new_height = (int)($this->height * $scale);
$xpos = 0;
$ypos = 0;
$image_old = $this->image;
$this->image = imagecreatetruecolor($width, $new_height);
if ($this->mime == 'image/png') {
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
$background = imagecolorallocatealpha($this->image, 255, 255, 255, 127);
imagecolortransparent($this->image, $background);
} else if ($this->mime == 'image/webp') {
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, $new_height, $background);
imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->width, $this->height);
imagedestroy($image_old);
$this->width = $width;
$this->height = $new_height;
}
您很可能缺少 $default
参数,它应该是 'w'
。
举个例子:
假设您有一张 128 x 128 的图片,想将其调整为 256(宽度),则应将其放大至 256 x 256。调用如下所示:
查看调整比例的计算方式:
$scale_w = $width / $this->width; // 256 / 128 = 2
$scale_h = 1;
if ($default == 'w') {
$scale = $scale_w; // = 2
} elseif ($default == 'h') {
$scale = $scale_h; // = 1
} else {
$scale = min($scale_w, $scale_h); // = 1
}
没有 'w'
标志 $scale
变为 1
并且带有 'w'
标志它变为 2
- 预期值。
算法稍后多次使用 $width
而不是 $new_width
因此新图像将是 256w x 128h 而不是 128 x 128,因为这条线:
$this->image = imagecreatetruecolor($width, $new_height);
但是 imagecopyresampled
使用 $new_width
所以你最终得到一个 256w x 128h 的图像,包含原始的 128 x 128 图像。