2011-03-27 72 views
2

我有以下的PHP腳本:PHP GD讀出原始像素數據

<?php 
class GimFile { 
    public $data = ''; 
    public $header = ''; 
    public $rgba = ''; 
    public $width = 0; 
    public $height = 0; 
    public function __construct($imagedata) { 
     $this->data = $imagedata; 
     if (substr($this->data, 1, 3) != 'GIM') { 
      exit("This data is not in GIM format"); 
     } 

     $this->header = substr($this->data, 0, 128); 
     $this->rgba = substr($this->data, 128); 

     // PHP can't unpack signed short from big-endian 
     // so we unpack it as unsigned, and subtract 2^16 if >2^15 
     $dimensions = array_values(unpack("n2", substr($this->header, 72, 76))); 
     for($i = 0; $i < count($dimensions); $i++) { 
      if($dimensions[$i] >= pow(2, 15)) { 
       $dimensions[$i] -= pow(2, 16); 
      } 
     } 

     list($this->width, $this->height) = $dimensions; 
    } 
    public function save($dest) { 
     //create image 
     $img = imagecreatetruecolor($this->width, $this->height); 
     //fill by iterating through your raw pixel data 
     for($x = 0; $x < $this->width; $x++) { 
      for($y = 0; $y < $this->height; $y++) { 
       $pos = ($y * $this->width + $x) * 4; 
       list($red, $green, $blue, $alpha) = array_values(unpack("C4", substr($this->rgba, $pos, $pos+4))); 
       $alpha >>= 1; // alpha transprancy is saved as 8bit, we need 7 bit 
       $color = imagecolorallocatealpha ($img, $red, $green, $blue, $alpha); 
       imagesetpixel($img, $x, $y, $color); 
      } 
     } 
     imagepng($img, $dest); 
     imagedestroy($img); 
    } 
} 

header('Content-type: image/png'); 
$contents = file_get_contents('gim'); 
$gim = new GimFile($contents); 
$gim->save('lol.png'); 

?> 

它應該閱讀獲得原始二進制數據作爲參數,而這個保存爲.png文件。該數據包含以下內容:
第一個128字節是標題,其中偏移72和74分別包含寬度和高度(有符號短大寫字母)。這些數據在構造函數中被解析。其餘數據是原始RGBA數據。
保存功能通過原始RGBA數據(遍歷每個像素),查找顏色並寫入相同寬度和高度的新圖像。然後將其保存到文件中。但是,由於某些原因,結果是錯誤的。

以下文件用於包含數據需要:http://2971.a.hostable.me/gim/gim
以下PNG預計:產生http://2971.a.hostable.me/gim/expected.png
下列PNG:http://2971.a.hostable.me/gim/output.png

最接近我來到了預期的結果,是通過設置$ alpha爲0,但是導致如下結果:http://2971.a.hostable.me/gim/noalpha.png

任何人都可以幫助修復腳本以產生預期結果嗎?

在此先感謝。

Hosh

回答

1

而是像我已經得到了消息「的圖片:‘http://localhost/gim/gim.php’無法顯示,因爲它包含錯誤」寫在畫布PNG。我已經使用gim文件(65,393字節)並在localhost上測試了腳本(支持GD庫)。此外,輸出文件lol.png看起來像彩虹(寬度:128px,高度:128px,bitdepth:24)。你確定這是正確的代碼(不是你的修改不起作用)嗎?我想幫忙,但不明白'gim'的格式。

P.S. gim.php是我的php腳本,我把你的代碼放在localhost的./gim文件夾中。

告訴我一些事情,如果你使用4字節來編碼128x128圖像中的每個像素......原始數據必須至少是65536字節+標題......所以如果這段代碼是正確的, 'gim'文件,因爲它只有65,393字節?

+1

nvm,我已經得到了這個。似乎存儲的alpha透明度實際上是一個8位整數,其中0是完全透明的,255是完全不透明的。完全與'imagecolorallocatealpha()'想要的相反。所以我從'$ alpha'中刪除了255,改變了標記並將其右移一次。像魅力一樣工作。我仍然會接受你的答案,因爲你是唯一的答案(在多個董事會上)甚至不願意回答。不管怎麼說,還是要謝謝你。 :) 最終代碼:'$ alpha =((int)(substr($ alpha - 255,1)))>> 1;' – 2011-03-29 11:46:04