[GD]產生bmp格式的圖片(imagebmp)_PHP教程

來源:互聯網
上載者:User

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(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]) . "";
}

// 位元影像資料
$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

http://www.bkjia.com/PHPjc/508374.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/508374.htmlTechArticleGD庫裡沒有產生bmp圖片的函數,所以自己寫了一個,這個函數尚有一個壓縮演算法沒有寫,不過已經夠用了。需要的同學可以看看。 int image...

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.