📜  PHP |想象一下 resampleImage()函数(1)

📅  最后修改于: 2023-12-03 15:03:40.478000             🧑  作者: Mango

PHP | 想象一下 resampleImage() 函数

简介

在图像处理中,一个常见的需求是要对图像进行调整大小(也称为缩放)。PHP 提供了 imagecopyresampled() 函数来实现这个过程。但是,这个函数有时需要使用大量的内存和 CPU 时间,如果你需要多次调整图像大小,那么就需要考虑一些其他的方法。这时就可以考虑使用自己编写的 resampleImage() 函数。

功能

resampleImage() 函数可以用于对一个图像进行缩放操作,支持以下功能:

  • 将指定的图像按照指定的比例进行缩放
  • 将指定的图像缩放到指定的大小
  • 支持多种缩放算法
  • 支持输出为 JPEG、PNG、GIF等多种格式
使用方法

resampleImage() 函数的使用方法如下:

$resized_image = resampleImage($source_image, $new_width, $new_height, $format, $quality, $filter);

其中,参数说明如下:

  • $source_image:要缩放的原始图像资源(必选)
  • $new_width:缩放后的图像宽度(必选)
  • $new_height:缩放后的图像高度(必选)
  • $format:输出格式,可以为 "jpg"、"png"、"gif" 等(可选,默认为 "jpg")
  • $quality:输出质量,一般范围为 0-100(可选,默认为 75)
  • $filter:缩放算法,可以为 IMG_FILTER_POINT、IMG_FILTER_BILINEAR、IMG_FILTER_GAUSSIAN_BLUR 等(可选,默认为 IMG_FILTER_BILINEAR)
示例

下面是一个示例代码,用于将一个图像缩放到指定的大小。在本例中,缩放算法为 IMG_FILTER_BILINEAR,输出格式为 JPEG,输出质量为 90。

// 要缩放的原始图像资源
$source_image = imagecreatefromjpeg('source_image.jpg');

// 缩放后的图像宽度和高度
$new_width = 640;
$new_height = 480;

// 输出格式,可以为 "jpg"、"png"、"gif" 等
$format = "jpg";

// 输出质量,一般范围为 0-100
$quality = 90;

// 缩放算法,可以为 IMG_FILTER_POINT、IMG_FILTER_BILINEAR、IMG_FILTER_GAUSSIAN_BLUR 等
$filter = IMG_FILTER_BILINEAR;

// 执行缩放操作,返回缩放后的图像资源
$resized_image = resampleImage($source_image, $new_width, $new_height, $format, $quality, $filter);

// 输出缩放后的图像到文件中
if ($format == "png") {
  imagepng($resized_image, 'resized_image.png', $quality);
} else if ($format == "gif") {
  imagegif($resized_image, 'resized_image.gif');
} else {
  imagejpeg($resized_image, 'resized_image.jpg', $quality);
}
实现

下面是 resampleImage() 函数的代码实现:

function resampleImage($source_image, $new_width, $new_height, $format = "jpg", $quality = 75, $filter = IMG_FILTER_BILINEAR) {
  // 获取原始图像的宽度和高度
  $source_width = imagesx($source_image);
  $source_height = imagesy($source_image);

  // 计算缩放后的图像宽度和高度
  if ($new_width == 0 && $new_height == 0) {
    // 如果新宽度和新高度都为0,则使用原始图像的大小
    $new_width = $source_width;
    $new_height = $source_height;
  } else if ($new_width == 0) {
    // 如果只设置了新宽度,则按比例计算新高度
    $new_width = $new_height * $source_width / $source_height;
  } else if ($new_height == 0) {
    // 如果只设置了新高度,则按比例计算新宽度
    $new_height = $new_width * $source_height / $source_width;
  }

  // 创建一张新的图像资源
  $target_image = imagecreatetruecolor($new_width, $new_height);

  // 对图像进行缩放操作
  imagecopyresampled($target_image, $source_image, 0, 0, 0, 0, $new_width, $new_height, $source_width, $source_height);

  // 根据输出格式输出缩放后的图像
  switch ($format) {
    case "gif":
      // 输出为 GIF 格式
      $result = $target_image;
      break;
    case "png":
      // 输出为 PNG 格式
      $result = $target_image;
      imagesavealpha($result, true);
      break;
    default:
      // 输出为 JPEG 格式
      $result = $target_image;
      imagefilter($result, $filter);
      break;
  }

  return $result;
}
总结

resampleImage() 函数能够有效地缩小图像,减小内存和 CPU 时间的开销。在实际生产中,如果需要对图像频繁地进行缩放处理,使用 resampleImage() 函数会是一个不错的选择。但是,在使用过程中需要根据实际需求,结合缩放算法、输出格式和输出质量等因素进行调整,以达到最佳的效果。