我有一个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。任何人都有解决方案或修复?
提前致谢
答案 0 :(得分:5)
.bmp
和wbmp
非常,非常不同的文件类型。
请注意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);