BMP图像调整大小时黑色结果图像问题-PHP

问题描述

|| 我有一个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);