图像复制重新采样有时会创建空白图像


imagecopyresampled sometimes creating blank images

我正在使用以下方法调整图像大小:

//load file and dimensions
$obj_original_image = imagecreatefromjpeg($str_file_path);
list($int_width, $int_height, $image_type) = getimagesize($str_file_path);
//compress file
$int_thumbnail_width = 320;
$int_ratio = $int_thumbnail_width / $int_width;
$int_new_width = $int_thumbnail_width;
$int_new_height = $int_height * $int_ratio;
$obj_image = imagecreatetruecolor($int_new_width, $int_new_height);
imagecopyresampled($obj_image, $obj_original_image, 0, 0, 0, 0, $int_new_width,     $int_new_height, $int_width, $int_height);
imagejpeg($obj_image, $GLOBALS['serverpath'] . '/images/uploaded/video-thumbs/'.$arr_data['thumbnail_folder'].'/' . $arr_data['id']. '.jpg', $int_compression = 85);

这通常工作得很好。然而,偶尔,它会产生一个空白的白色图像。我在 http://php.net/manual/en/function.imagecopyresampled.php 读过这张纸条:

由于调色板图像限制(255+1 色)而出现问题。重采样或滤波图像通常需要比 255 更多的颜色,这是一种近似值来计算新的重采样像素及其颜色。对于调色板图像,我们尝试分配新颜色,如果失败,我们选择最接近(理论上)计算的颜色。这并不总是最接近的视觉颜色。这可能会产生奇怪的结果,例如空白(或视觉空白)图像。要跳过此问题,请使用真彩色图像作为目标图像,例如由 imagecreatetruecolor() 创建的图像。

但是,我已经在使用imagecreatetruecolor。我总是缩放相同大小的图像,因此它不会是宽度/高度问题。它只是偶尔发生,大多数时候图像缩放工作正常。关于如何解决这个问题的任何想法?

当您已经使用 imagecreatefromjpeg() 打开图像时,没有理由使用 getimagesize() .您可以使用imagesx()imagesy()来获取宽度/高度。getimagesize 与 GD 是分开的,它将重新打开图像,重新解析它,等等......

另请注意,GD非常愚蠢,它会迫使您确定您拥有的图像类型并调用适当的createfrom函数。 如果您尝试打开除.jpg图像以外的任何内容,imagecreatefromjpeg()将失败。

$obj_original_image = imagecreatefromjpeg($str_file_path);
if ($obj_original_image === FALSE) {
   die("Unable to load $str_file_path. Not a jpg?");
}
etc... etc...
$status = imagecopyresampled($obj_image, $obj_original_image, 0, 0, 0, 0, $int_new_width,     $int_new_height, $int_width, $int_height);
if ($status === FALSE) {
    die("imagecopyresampled failed!");
}

此外,在高度/宽度计算中添加一些调试 - 输出正在生成的值。也许其中一个或多个显示为 0,因此您最终会重新采样到不存在的大小。

您提到正在处理的图像的大小总是相同的,但是分辨率总是相同的吗?如果您正在使用特别高分辨率的图像,则根据我的经验,某些操作的内存可能会不足,这将产生空白的白色图像。如果是这种情况,您可以尝试通过在 memory_limit 参数下增加分配给 php 的内存量来修复它.ini php。据我所知,该值适用于图像处理。