imagecopyresampled有时会创建空白图像

时间:2011-05-19 16:31:02

标签: php image-processing image-manipulation

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

//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更多的颜色,一种近似用于计算新的重采样像素及其颜色。使用调色板图像,我们尝试分配新颜色,如果失败,我们选择最接近(理论上)的计算颜色。这并不总是最接近的视觉颜色。这可能会产生奇怪的结果,如空白(或视觉空白)图像。要跳过此问题,请使用truecolor图像作为目标图像,例如由imagecreatetruecolor()创建的图像。

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

2 个答案:

答案 0 :(得分:0)

当您使用getimagesize()打开图像时,没有理由使用imagecreatefromjpeg()。您可以使用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,因此您最终重新采样到不存在的大小。

答案 1 :(得分:0)

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