PHP CURL获取远程图片资源并处理

PHP piniu 19浏览 0评论

PHP从URL加载并处理图片,核心思路无非是两步:先用HTTP请求把远程图片数据抓取到本地,再利用PHP的图像处理库(最常用的是GD库)对这些数据进行解析和操作。

对于一些复杂的场景,比如需要设置请求头、处理重定向、控制超时时间,或者目标服务器有一些反爬机制等,CURL提供了更强大的控制力,是处理远程资源的首选。

这里采用CURL的方式下载远程图片资源,并处理,示例代码如下:

$imageUrl = 'https://test.remote.com/demo-image.png';
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $imageUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回内容而不是直接输出
curl_setopt($ch, CURLOPT_HEADER, false);      // 不返回HTTP头信息
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动处理301/302重定向
curl_setopt($ch, CURLOPT_TIMEOUT, 10);        // 设置超时时间,10秒
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 如果遇到SSL证书问题,可以暂时禁用,但不推荐在生产环境这样做

$imageData = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if (curl_errno($ch)) {
    // cURL出错了,可能是网络问题或者URL有问题
    error_log('cURL error: ' . curl_error($ch));
    $imageData = false;
    
} elseif ($httpCode !== 200) {
    // HTTP状态码不是200,说明请求可能失败了,比如404、500等
    error_log("Failed to fetch image. HTTP Code: " . $httpCode . " from " . $imageUrl);
    $imageData = false;
}

curl_close($ch);

if ($imageData !== false) {
    // 成功获取数据,继续GD库处理
    $image = imagecreatefromstring($imageData);
    if ($image !== false) {
        // ... 图像处理逻辑 ...
        // 比如,我们要生成一个200x200的缩略图
        $width = imagesx($image);
        $height = imagesy($image);
        $newWidth = 200;
        $newHeight = (int)(($height / $width) * $newWidth); // 等比例缩放

        $thumb = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($thumb, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

        // 输出或保存缩略图
        // header('Content-Type: image/jpeg');
        // imagejpeg($thumb);
        imagejpeg($thumb, 'local_thumbnail.jpg'); // 保存到文件

        imagedestroy($image); // 释放图像资源
        imagedestroy($thumb); // 释放图像资源
    } else {
        error_log("GD failed to create image from string for " . $imageUrl);
    }
}

处理图片时,GD库是PHP内置的强大工具。imagecreatefromstring() 是个好东西,它能自动识别多种图片格式(JPEG, PNG, GIF, BMP, WebP等),省去了我们自己判断格式的麻烦。一旦有了图像资源,就可以用 imagesx(), imagesy() 获取尺寸,imagecreatetruecolor() 创建新画布,imagecopyresampled() 进行缩放,最后用 imagejpeg(), imagepng() 等函数输出或保存。

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • *昵称:
  • *邮箱: