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

时间:2011-06-15 15:48:31

标签: 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中使用带apache的php。任何人都有解决方案或修复?

提前致谢

4 个答案:

答案 0 :(得分:5)

.bmpwbmp 非常非常不同的文件类型。

请注意content-type标题:

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

每次imagecreatefromwbmp($file)呼叫$file .bmp .bmp都会失败。

有关如何加载{{1}}文件的信息,请参阅this thread。它不漂亮。

答案 1 :(得分:1)

正如PHP imagecopyresampled() docs所述:


注意:

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


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

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

答案 2 :(得分:1)

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

该项目名为PHP Image Magician

答案 3 :(得分:0)

<?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);