예제 #1
0
function decbin8($d)
{
    return decbinx($d, 8);
}
예제 #2
0
 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;
     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 .= $this->int_to_dword($size);
     // size of file (4b)
     $ret .= $this->int_to_dword(0);
     // reserved (4b)
     $ret .= $this->int_to_dword($offset);
     // byte location in the file which is first byte of IMAGE (4b)
     // Bitmap Info Header
     $ret .= $this->int_to_dword(40);
     // Size of BITMAPINFOHEADER (4b)
     $ret .= $this->int_to_dword($Width);
     // width of bitmap (4b)
     $ret .= $this->int_to_dword($Height);
     // height of bitmap (4b)
     $ret .= $this->int_to_word(1);
     // biPlanes = 1 (2b)
     $ret .= $this->int_to_word($BitCount);
     // biBitCount = {1 (mono) or 4 (16 clr ) or 8 (256 clr) or 24 (16 Mil)} (2b)
     $ret .= $this->int_to_dword($RLE);
     // RLE COMPRESSION (4b)
     $ret .= $this->int_to_dword(0);
     // width x height (4b)
     $ret .= $this->int_to_dword(0);
     // biXPelsPerMeter (4b)
     $ret .= $this->int_to_dword(0);
     // biYPelsPerMeter (4b)
     $ret .= $this->int_to_dword(0);
     // Number of palettes used (4b)
     $ret .= $this->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 .= $this->inttobyte($color["blue"]);
             $ret .= $this->inttobyte($color["green"]);
             $ret .= $this->inttobyte($color["red"]);
             $ret .= $this->inttobyte(0);
             //RESERVED
         }
         $CT = $ColorTotal;
         for ($p = $ColorTotal; $p < $CC; $p++) {
             $ret .= $this->inttobyte(0);
             $ret .= $this->inttobyte(0);
             $ret .= $this->inttobyte(0);
             $ret .= $this->inttobyte(0);
             //RESERVED
         }
     }
     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 .= $this->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 .= $this->inttobyte(bindec($bWrite));
             }
             for ($z = 0; $z < $Zbytek; $z++) {
                 $retd .= $this->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) {
         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;
     }
 }