2011-05-19 96 views
1

我使用调整图像大小:imagecopyresampled有时创建空白影像

//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。我总是缩放相同大小的图像,因此它不能成为宽度/高度问题。它只是有时会发生,大多数时候图像缩放工作正常。任何想法如何解决这个问题?

回答

0

当您已经打开图片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,所以最终重新采样到一个不存在的大小。

+0

谢谢马克B,获取文件上的坐标和有效点是一个JPG和宽度和高度的好建议。我知道它始终是jpg,不过因为我刚刚将原始网络摄像头图像捕获保存为jpg,因此在调整大小之前。 – Newmania 2011-05-21 08:53:25

0

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

+0

谢谢,文件大小会因网络摄像头捕获而有所不同(尽管我认为应该是相同的解析度)。但有一点可以用尽内存,尽管我已经将memory_limit设置为128M,所以我对此表示怀疑(原始jpg约为80kb)。尽管(在文件内而不是在php.ini中,使用ini_set(“memory_limit”,“256M”);),但我希望这可能有所帮助。我现在也保存了原始的jpg图像,而不仅仅是重新调整大小的图像,所以如果这种情况再次发生,我会得到导致问题的原始文件,然后可以正确测试它。 – Newmania 2011-05-21 08:55:29