问题描述
||
我有一个PHP脚本来重新调整图像文件的大小,如下所示;
$file = \"test.bmp\";
$ext = pathinfo($file,PATHINFO_EXTENSION);
$info = pathinfo($file);
$file_name = basename($file,\'.\'.$info[\'extension\']);
$thumbname = \"thumb/\".$file_name.\".\".$ext;
$maxh = 200;
$maxw = 200;
$quality = 100;
list($width,$height)=getimagesize($file);
$src = imagecreatefromwbmp($file);
$tmp = imagecreatetruecolor($maxw,$maxh);
imagecopyresampled($tmp,$src,200,$width,$height);
imagejpeg($tmp,$thumbname,$quality);
imagedestroy($tmp);
该脚本假定将Windows位图图像的大小调整为200x200缩略图。但是,我得到的是200x200黑色图像。我在Windows PC中将apache与PHP一起使用。任何人都有解决方案或解决方案?
提前致谢
解决方法
.bmp
和wbmp
是非常不同的文件类型。
请注意content-type
标头:
Content-Type: image/x-xbitmap
Content-Type: image/vnd.wap.wbmp
每次在$file
是.bmp
的情况下调用imagecreatefromwbmp($file)
都会失败。
有关如何加载.bmp
文件的信息,请参见此线程。不好看。
, 正如PHP imagecopyresampled()文档中指出的那样:
注意:
由于调色板图像限制(255 + 1种颜色),因此出现问题。重采样或过滤图像通常需要比255种更多的颜色,一种近似方法用于计算新的重采样像素及其颜色。对于调色板图像,我们尝试分配新的颜色,如果失败,则选择最接近的(理论上)计算的颜色。这并不总是最接近的视觉颜色。这可能会产生奇怪的结果,例如空白(或视觉上空白)的图像。要跳过此问题,请使用truecolor图像作为目标图像,例如imagecreatetruecolor()创建的图像。
要查看是否存在这种情况,可以使用imageistruecolor()并将其内容复制到新的truecolor图像上,然后再进行“ copyresampling”操作:
if( !imageistruecolor($src) ){
$newim = imagecreatetruecolor( $width,$height );
imagecopy( $newim,$src,$width,$height );
imagedestroy($src);
$src = $newim;
}
, Github上有一个新的开源项目,允许在PHP中读取和保存BMP文件(和其他文件格式)。
该项目称为PHP Image Magician。
, <?php
//Create New \'Thumbnail\' Image
$newImageWidth = 200;
$newImageHeight = 200;
$newImage = imagecreatetruecolor($newImageWidth,$newImageHeight);
$newImageFile = \'output.jpg\';
$newImageQuality = 100;
//Load old Image(bmp,jpg,gif,png,etc)
$oldImageFile = \"test.jpg\";
//Specific function
$oldImage = imagecreatefromjpeg($oldImageFile);
//Non-Specific function
//$oldImageContent = file_get_contents($oldImageFile);
//$oldImage = imagecreatefromstring($oldImageContent);
//Get old Image\'s details
$oldImageWidth = imagesx($oldImage);
$oldImageHeight = imagesy($oldImage);
//Copy to new Image
imagecopyresampled($newImage,$oldImage,$newImageWidth,$newImageHeight,$oldImageWidth,$oldImageHeight);
//Output to file
imagejpeg($newImage,$newImageFile,$newImageQuality);