使用PHP调整BMP图像大小的黑色结果图像问题


Black result image problem on BMP image resize using 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,0,0,0,0,200,200,$width,$height);
  imagejpeg($tmp,$thumbname,$quality);
  imagedestroy($tmp);

假设脚本将Windows位图图像的大小调整为200x200缩略图。但是,我得到了一张200x200的黑色图片。我在Windows PC中使用PHP和Apache。如何修复此问题?

.bmpwbmp是不同的文件类型。

注意content-type标题:

Content-Type: image/x-xbitmap
Content-Type: image/vnd.wap.wbmp

$file.bmp的情况下调用imagecreatefromwbmp($file)每次都会失败。

有关如何加载.bmp文件的信息,请参阅此线程。它不漂亮。

正如PHP imagecopyrasampled()docs:中所指出的那样


注:

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


要查看是否是这种情况,您可以使用imageistruecolor()并在"复制重新采样"之前将内容复制到新的真彩色图像:

if( !imageistruecolor($src) ){
    $newim = imagecreatetruecolor( $width, $height );
    imagecopy( $newim, $src, 0, 0, 0, 0, $width, $height );
    imagedestroy($src);
    $src = $newim;
}

Github上有一个新的开源项目,允许用PHP读取和保存BMP文件(以及其他文件格式)。

该项目名为PHP图像魔术师。

<?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, 0, 0, 0, 0, $newImageWidth, $newImageHeight, $oldImageWidth, $oldImageHeight);
//Output to file
imagejpeg($newImage, $newImageFile, $newImageQuality);