国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

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

2019-11-18 17:19:58
字體:
來源:轉載
供稿:網(wǎng)友

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

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

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

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

Demo:

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

/**
* 創(chuàng)建bmp格式圖片
*
* @author: legend(legendsky@hotmail.com)
* @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']) . "/0";
        }
       
        // 位圖數(shù)據(jù)
        $bmp_data = '';
 
        // 非壓縮
        if ($compression == 0 || $bit < 8)
        {
            if (!in_array($bit, array(1, 4, 8)))
            {
                $bit = 8;
            }
 
            $compression = 0;
           
            // 每行字節(jié)數(shù)必須為4的倍數(shù),補齊。
            $extra = '';
            $padding = 4 - ceil($width / (8 / $bit)) % 4;
            if ($padding % 4 != 0)
            {
                $extra = str_repeat("/0", $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 = "/0";
                $same_num   = 0;
                for ($i = 0; $i <= $width; $i ++)
                {
                    $index = imagecolorat($im, $i, $j);
                    if ($index !== $last_index || $same_num > 255)
                    {
                        if ($same_num != 0)
                        {
                            $bmp_data .= chr($same_num) . chr($last_index);
                        }
 
                        $last_index = $index;
                        $same_num = 1;
                    }
                    else
                    {
                        $same_num ++;
                    }
                }
 
                $bmp_data .= "/0/0";
            }
           
            $bmp_data .= "/0/1";
        }
 
        $size_quad = strlen($rgb_quad);
        $size_data = strlen($bmp_data);
    }
    else
    {
        // 每行字節(jié)數(shù)必須為4的倍數(shù),補齊。
        $extra = '';
        $padding = 4 - ($width * ($bit / 8)) % 4;
        if ($padding % 4 != 0)
        {
            $extra = str_repeat("/0", $padding);
        }
 
        // 位圖數(shù)據(jù)
        $bmp_data = '';
 
        for ($j = $height - 1; $j >= 0; $j --)
        {
            for ($i = 0; $i < $width; $i ++)
            {
                $index  = imagecolorat($im, $i, $j);
                $colors = imagecolorsforindex($im, $index);
               
                if ($bit == 16)
                {
                    $bin = 0 << $bit;
 
                    $bin |= ($colors['red'] >> 3) << 10;
                    $bin |= ($colors['green'] >> 3) << 5;
                    $bin |= $colors['blue'] >> 3;
 
                    $bmp_data .= pack("v", $bin);
                }
                else
                {
                    $bmp_data .= pack("c*", $colors['blue'], $colors['green'], $colors['red']);
                }
               
                // todo: 32bit;
            }
 
            $bmp_data .= $extra;
        }
 
        $size_quad = 0;
        $size_data = strlen($bmp_data);
        $colors_num = 0;
    }
 
    // 位圖文件頭
    $file_header = "BM" . pack("V3", 54 + $size_quad + $size_data, 0, 54 + $size_quad);
 
    // 位圖信息頭
    $info_header = pack("V3v2V*", 0x28, $width, $height, 1, $bit, $compression, $size_data, 0, 0, $colors_num, 0);
   
    // 寫入文件
    if ($filename != '')
    {
        $fp = fopen("test.bmp", "wb");
 
        fwrite($fp, $file_header);
        fwrite($fp, $info_header);
        fwrite($fp, $rgb_quad);
        fwrite($fp, $bmp_data);
        fclose($fp);
 
        return 1;
    }
   
    // 瀏覽器輸出
    header("Content-Type: image/bmp");
    echo $file_header . $info_header;
    echo $rgb_quad;
    echo $bmp_data;
   
    return 1;
}
參考資料:BMP文件格式分析 (出處沒有找到…)

原創(chuàng)文章,轉載請注明出處。

出處:http://www.ugia.cn/?p=96


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 临清市| 石阡县| 滕州市| 曲靖市| 工布江达县| 界首市| 雷州市| 鄂伦春自治旗| 容城县| 固阳县| 礼泉县| 莲花县| 乐至县| 临沧市| 准格尔旗| 山东省| 秀山| 尉犁县| 龙里县| 澳门| 比如县| 吉木乃县| 秦皇岛市| 崇左市| 罗山县| 鹤庆县| 沿河| 额济纳旗| 微山县| 宝山区| 汾西县| 余姚市| 汨罗市| 蒙自县| 崇仁县| 房产| 临夏县| 遂川县| 渑池县| 肃北| 广宁县|