Exemple #1
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;
	if($BitCount<24) $palsize=pow(2,$BitCount)*4;
	$size=(floor($Width/(8/$BitCount))+$Zbytek)*$Height+54;
	$size+=$palsize;
	$offset=54+$palsize;
	$ret = 'BM';                      
	$ret .= int_to_dword($size);    
	$ret .= int_to_dword(0);       
	$ret .= int_to_dword($offset);     
	$ret .= int_to_dword(40);       
	$ret .= int_to_dword($Width);       
	$ret .= int_to_dword($Height);       
	$ret .= int_to_word(1);       
	$ret .= int_to_word($BitCount);      
	$ret .= int_to_dword($RLE);       
	$ret .= int_to_dword(0);       
	$ret .= int_to_dword(0);       
	$ret .= int_to_dword(0);       
	$ret .= int_to_dword(0);       
	$ret .= int_to_dword(0);       
	$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); 
		};
		$CT=$ColorTotal;
		for($p=$ColorTotal;$p<$CC;$p++)
		{
			$ret.=inttobyte(0);
			$ret.=inttobyte(0);
			$ret.=inttobyte(0);
			$ret.=inttobyte(0); 
		};
	};
	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)
	{
		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;
	};
};
Exemple #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;
    // 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;
    }
}
Exemple #3
0
function imagebmp(&$img, $filename = '')
{
    $widthOrig = imagesx($img);
    $widthFloor = floor($widthOrig / 16) * 16;
    $widthCeil = ceil($widthOrig / 16) * 16;
    $height = imagesy($img);
    $size = $widthCeil * $height * 3 + 54;
    // Bitmap File Header
    $result = 'BM';
    // header (2b)
    $result .= int_to_dword($size);
    // size of file (4b)
    $result .= int_to_dword(0);
    // reserved (4b)
    $result .= int_to_dword(54);
    // byte location in the file which is first byte of IMAGE (4b)
    // Bitmap Info Header
    $result .= int_to_dword(40);
    // Size of BITMAPINFOHEADER (4b)
    $result .= int_to_dword($widthCeil);
    // width of bitmap (4b)
    $result .= int_to_dword($height);
    // height of bitmap (4b)
    $result .= int_to_word(1);
    // biPlanes = 1 (2b)
    $result .= int_to_word(24);
    // biBitCount = {1 (mono) or 4 (16 clr ) or 8 (256 clr) or 24 (16 Mil)} (2b
    $result .= int_to_dword(0);
    // RLE COMPRESSION (4b)
    $result .= int_to_dword(0);
    // width x height (4b)
    $result .= int_to_dword(0);
    // biXPelsPerMeter (4b)
    $result .= int_to_dword(0);
    // biYPelsPerMeter (4b)
    $result .= int_to_dword(0);
    // Number of palettes used (4b)
    $result .= int_to_dword(0);
    // Number of important colour (4b)
    // is faster than chr()
    $arrChr = array();
    for ($i = 0; $i < 256; $i++) {
        $arrChr[$i] = chr($i);
    }
    // creates image data
    $bgfillcolor = array('red' => 0, 'green' => 0, 'blue' => 0);
    // bottom to top - left to right - attention blue green red !!!
    $y = $height - 1;
    for ($y2 = 0; $y2 < $height; $y2++) {
        for ($x = 0; $x < $widthFloor;) {
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x++, $y));
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x++, $y));
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x++, $y));
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x++, $y));
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x++, $y));
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x++, $y));
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x++, $y));
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
            $rgb = imagecolorsforindex($img, imagecolorat($img, $x++, $y));
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
        }
        for ($x = $widthFloor; $x < $widthCeil; $x++) {
            $rgb = $x < $widthOrig ? imagecolorsforindex($img, imagecolorat($img, $x, $y)) : $bgfillcolor;
            $result .= $arrChr[$rgb['blue']] . $arrChr[$rgb['green']] . $arrChr[$rgb['red']];
        }
        $y--;
    }
    // see imagegif
    if ($filename == '') {
        echo $result;
    } else {
        $file = fopen($filename, 'wb');
        fwrite($file, $result);
        fclose($file);
    }
}