程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> [GD]生成bmp格式的圖片(imagebmp)

[GD]生成bmp格式的圖片(imagebmp)

編輯:關於PHP編程

GD庫裡沒有生成bmp圖片的函數,所以自己寫了一個,這個函數尚有一個壓縮算法沒有寫,不過已經夠用了。需要的同學可以看看。

int imagebmp ( resource image [, string filename [, int $bit [, int compression]]] )

$im: 圖像資源
$filename: 如果要另存為文件,請指定文件名,為空則直接在浏覽器輸出
$bit: 圖像質量(1、4、8、16、24、32位)
$compression: 壓縮方式,0為不壓縮,1使用RLE8壓縮算法進行壓縮

注意:這個函數仍然需要GD庫的支持。

Demo:

$im = imagecreatefrompng("test.png");
imagebmp($im);
imagedestroy($im);
Source:

/**
* 創建bmp格式圖片
*
* @author: legend([email protected])
* @link: http://www.ugia.cn/?p=96
* @description: create Bitmap-File with GD library
* @version: 0.1
*
* @param resource $im          圖像資源
* @param string   $filename    如果要另存為文件,請指定文件名,為空則直接在浏覽器輸出
* @param integer  $bit         圖像質量(1、4、8、16、24、32位)
* @param integer  $compression 壓縮方式,0為不壓縮,1使用RLE8壓縮算法進行壓縮
*
* @return integer
*/
function imagebmp(&$im, $filename = , $bit = 8, $compression = 0)
{
    if (!in_array($bit, array(1, 4, 8, 16, 24, 32)))
    {
        $bit = 8;
    }
    else if ($bit == 32) // todo:32 bit
    {
        $bit = 24;
    }
 
    $bits = pow(2, $bit);
   
    // 調整調色板
    imagetruecolortopalette($im, true, $bits);
    $width  = imagesx($im);
    $height = imagesy($im);
    $colors_num = imagecolorstotal($im);
   
    if ($bit <= 8)
    {
        // 顏色索引
        $rgb_quad = ;
        for ($i = 0; $i < $colors_num; $i ++)
        {
            $colors = imagecolorsforindex($im, $i);
            $rgb_quad .= chr($colors[blue]) . chr($colors[green]) . chr($colors[red]) . "";
        }
       
        // 位圖數據
        $bmp_data = ;
 
        // 非壓縮
        if ($compression == 0 || $bit < 8)
        {
            if (!in_array($bit, array(1, 4, 8)))
            {
                $bit = 8;
            }
 
            $compression = 0;
           
            // 每行字節數必須為4的倍數,補齊。
            $extra = ;
            $padding = 4 - ceil($width / (8 / $bit)) % 4;
            if ($padding % 4 != 0)
            {
                $extra = str_repeat("", $padding);
            }
           
            for ($j = $height - 1; $j >= 0; $j --)
            {
                $i = 0;
                while ($i < $width)
                {
                    $bin = 0;
                    $limit = $width - $i < 8 / $bit ? (8 / $bit - $width + $i) * $bit : 0;
 
                    for ($k = 8 - $bit; $k >= $limit; $k -= $bit)
                    {
                        $index = imagecolorat($im, $i, $j);
                        $bin |= $index << $k;
                        $i ++;
                    }
 
                    $bmp_data .= chr($bin);
                }
               
                $bmp_data .= $extra;
            }
        }
        // RLE8 壓縮
        else if ($compression == 1 && $bit == 8)
        {
            for ($j = $height - 1; $j >= 0; $j --)
            {
                $last_index = "";
                $same_num   = 0;
                for ($i = 0; $i <= $width; $i ++)
                {
                    $index = imagecolorat($im, $i, $j);
                    if ($index !== $last_index || $same_num > 255)
               &nb

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved