首页 > Other > php 中图像压缩处理类(一)bmp.php

php 中图像压缩处理类(一)bmp.php

<?php
/**
* @(#)bmp.php
* PHP version 5.2.3
*
*
* Copyright 2007 SoftRoad. All Rights Reserved.
*
*====================================================================
* 涓s
*
* 新作成 2007 年5月17日 蒋彪
*/
function imagebmp($img, $file = “”, $RLE = 0) {

$ColorCount = imagecolorstotal($img);

$Transparent = imagecolortransparent($img);
$IsTransparent = $Transparent != -1;

if ($IsTransparent)
$ColorCount–;

if ($ColorCount == 0) {
$ColorCount = 0;
$BitCount = 24;
};
if (($ColorCount > 0) and ($ColorCount <= 2)) {
$ColorCount = 2;
$BitCount = 1;
};
if (($ColorCount > 2) and ($ColorCount <= 16)) {
$ColorCount = 16;
$BitCount = 4;
};
if (($ColorCount > 16) and ($ColorCount <= 256)) {
$ColorCount = 0;
$BitCount = 8;
};

$Width = imagesx($img);
$Height = imagesy($img);

$Zbytek = (4 – ($Width / (8 / $BitCount)) % 4) % 4;
$palsize = 0; // cid added
if ($BitCount < 24)
$palsize = pow(2, $BitCount) * 4;

$size = (floor($Width / (8 / $BitCount)) + $Zbytek) * $Height +54;
$size += $palsize;
$offset = 54 + $palsize;

// Bitmap File Header
$ret = ‘BM’; // header (2b)
$ret .= int_to_dword($size); // size of file (4b)
$ret .= int_to_dword(0); // reserved (4b)
$ret .= int_to_dword($offset); // byte location in the file which is first byte of IMAGE (4b)
// Bitmap Info Header
$ret .= int_to_dword(40); // Size of BITMAPINFOHEADER (4b)
$ret .= int_to_dword($Width); // width of bitmap (4b)
$ret .= int_to_dword($Height); // height of bitmap (4b)
$ret .= int_to_word(1); // biPlanes = 1 (2b)
$ret .= int_to_word($BitCount); // biBitCount = {1 (mono) or 4 (16 clr ) or 8 (256 clr) or 24 (16 Mil)} (2b)
$ret .= int_to_dword($RLE); // RLE COMPRESSION (4b)
$ret .= int_to_dword(0); // width x height (4b)
$ret .= int_to_dword(0); // biXPelsPerMeter (4b)
$ret .= int_to_dword(0); // biYPelsPerMeter (4b)
$ret .= int_to_dword(0); // Number of palettes used (4b)
$ret .= int_to_dword(0); // Number of important colour (4b)
// image data

$CC = $ColorCount;
$sl1 = strlen($ret);
if ($CC == 0)
$CC = 256;
if ($BitCount < 24) {
$ColorTotal = imagecolorstotal($img);
if ($IsTransparent)
$ColorTotal–;

for ($p = 0; $p < $ColorTotal; $p++) {
$color = imagecolorsforindex($img, $p);
$ret .= inttobyte($color[“blue”]);
$ret .= inttobyte($color[“green”]);
$ret .= inttobyte($color[“red”]);
$ret .= inttobyte(0); //RESERVED
};

$CT = $ColorTotal;
for ($p = $ColorTotal; $p < $CC; $p++) {
$ret .= inttobyte(0);
$ret .= inttobyte(0);
$ret .= inttobyte(0);
$ret .= inttobyte(0); //RESERVED
};
};

$retd = ”; // cid added
if ($BitCount <= 8) {

for ($y = $Height -1; $y >= 0; $y–) {
$bWrite = “”;
for ($x = 0; $x < $Width; $x++) {
$color = imagecolorat($img, $x, $y);
$bWrite .= decbinx($color, $BitCount);
if (strlen($bWrite) == 8) {
$retd .= inttobyte(bindec($bWrite));
$bWrite = “”;
};
};

if ((strlen($bWrite) < 8) and (strlen($bWrite) != 0)) {
$sl = strlen($bWrite);
for ($t = 0; $t < 8 – $sl; $t++)
$sl .= “0”;
$retd .= inttobyte(bindec($bWrite));
};
for ($z = 0; $z < $Zbytek; $z++)
$retd .= inttobyte(0);
};
};

if (($RLE == 1) and ($BitCount == 8)) {
for ($t = 0; $t < strlen($retd); $t += 4) {
if ($t != 0)
if (($t) % $Width == 0)
$ret .= chr(0) .
chr(0);

if (($t +5) % $Width == 0) {
$ret .= chr(0) . chr(5) . substr($retd, $t, 5) . chr(0);
$t += 1;
}
if (($t +6) % $Width == 0) {
$ret .= chr(0) . chr(6) . substr($retd, $t, 6);
$t += 2;
} else {
$ret .= chr(0) . chr(4) . substr($retd, $t, 4);
};
};
$ret .= chr(0) . chr(1);
} else {
$ret .= $retd;
};

if ($BitCount == 24) {
$Dopl = ”; // cid added
for ($z = 0; $z < $Zbytek; $z++)
$Dopl .= chr(0);

for ($y = $Height -1; $y >= 0; $y–) {
for ($x = 0; $x < $Width; $x++) {
$color = imagecolorsforindex($img, ImageColorAt($img, $x, $y));
$ret .= chr($color[“blue”]) . chr($color[“green”]) . chr($color[“red”]);
}
$ret .= $Dopl;
};

};

if ($file != “”) {
$r = ($f = fopen($file, “w”));
$r = $r and fwrite($f, $ret);
$r = $r and fclose($f);
return $r;
} else {
echo $ret;
};
};

/*
*

分类:Other
  1. 还没有评论。
  1. No trackbacks yet.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: