2011-06-15 42 views
0

我有一個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與Apache。任何人有解決方案或修復?預先

+0

只是檢查'$ src'使用它之前。也許它是'FALSE'? – hakre 2011-06-15 15:54:03

+0

@hakre,我應該更改/替換 – 2011-06-15 15:55:51

+0

在這裏的示例代碼中查找'if(!$ im)':http://php.net/manual/en/function.imagecreatefromwbmp.php – hakre 2011-06-15 15:59:02

回答

4

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

注意content-type標題:

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

調用imagecreatefromwbmp($file)其中$file.bmp會失敗每次。

this thread關於如何加載.bmp文件信息。這並不漂亮。

+0

喜@rockerest,我得到烏爾信息有幫助..但我怎麼能解決我的概率?有沒有更好的'$ src'? – 2011-06-15 16:15:44

+0

@blasteralfred它不是關於'$ src'的。 'imagecreatefromwbmp'是加載'.bmp'的錯誤函數。他們是兩種不同的格式。您需要創建一個名爲'imagecreatefrombmp'的自定義函數,並使其內容與[here](http://www.webdeveloper.com/forum/showpost.php?p=590870&postcount=5)中給出的函數相同。我沒有測試過,但它應該可以工作。 – rockerest 2011-06-15 16:19:27

+0

作品好花花公子..非常感謝你... :) – 2011-06-15 16:22:54

1

由於如在PHP imagecopyresampled() docs指出:


注:

有一個問題,由於調色板圖像限制(255層+ 1的顏色)。對圖像進行重採樣或濾波通常需要比255更多的顏色,使用一種近似來計算新的重採樣像素及其顏色。使用調色板圖像我們嘗試分配一種新的顏色,如果失敗了,我們選擇最接近的(理論上)計算的顏色。這並不總是最接近的視覺顏色。這可能會產生一個奇怪的結果,如空白(或視覺空白)的圖像。要跳過這個問題,請使用真彩色圖像作爲目標圖像,例如用imagecreatetruecolor()創建。


要查看它是否可以在「copyresampling」之前使用imageistruecolor()和內容複製到一個新的真彩色圖像的情況下:

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

良好的信息,但我堅信這並沒有解決實際問題 – rockerest 2011-06-15 16:08:56

+0

我也想過,但沒有能夠收集的代碼。感謝張貼。 – hakre 2011-06-15 16:22:58

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); 
+0

這個解決方案可以處理任何類型的gd支持的源圖像。 – 2011-06-15 16:19:38

+0

但是GD不支持BMP文件。你需要轉換它們。 ImageMagik或使用通用命令行工具。 – 2011-06-15 16:21:46

+0

此外,當你想要一個快速的解決方案來加載GD支持的任何圖像時,這是很好的,但與每個文件類型的特定功能相比,'file_get_contents' +'imagecreatefromstring'的速度非常慢,並且交換機不是_that_更多的工作:)我剛纔有了實際的基準,但是我再也找不到它們了。還在尋找.... – rockerest 2011-06-15 16:25:09

1

有Github上一個新的開源項目,允許在PHP BMP文件(及其他文件格式)讀取和保存。

該項目被稱爲PHP Image Magician