Вход Регистрация
Файл: outs/wideimage/vendor/de77/BMP.php
Строк: 126
<?php
    
/**
 * @author Gasper Kozak
 * @copyright 2007-2011

    This file is part of WideImage.
        
    WideImage is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2.1 of the License, or
    (at your option) any later version.
        
    WideImage is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
        
    You should have received a copy of the GNU Lesser General Public License
    along with WideImage; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    * @package Internal/Mappers
  **/

    /**
     * External code for BMP
     * 
     * Adapted for use in WideImage. Code used with permission from the original author de77.
     * http://de77.com/php/read-and-write-bmp-in-php-imagecreatefrombmp-imagebmp
     * 
     * @author de77
     * @license MIT
     * @url de77.com
     * @version 21.08.2010
     * 
     * @package Internal/Mappers
     */
class WideImage_vendor_de77_BMP
{
    public static function 
imagebmp(&$img$filename false)
    {
        
$wid imagesx($img);
        
$hei imagesy($img);
        
$wid_pad str_pad(''$wid 4"");
        
        
$size 54 + ($wid $wid_pad) * $hei 3//fixed
        
        //prepare & save header
        
$header['identifier']        = 'BM';
        
$header['file_size']        = self::dword($size);
        
$header['reserved']            = self::dword(0);
        
$header['bitmap_data']        = self::dword(54);
        
$header['header_size']        = self::dword(40);
        
$header['width']            = self::dword($wid);
        
$header['height']            = self::dword($hei);
        
$header['planes']            = self::word(1);
        
$header['bits_per_pixel']    = self::word(24);
        
$header['compression']        = self::dword(0);
        
$header['data_size']        = self::dword(0);
        
$header['h_resolution']        = self::dword(0);
        
$header['v_resolution']        = self::dword(0);
        
$header['colors']            = self::dword(0);
        
$header['important_colors']    = self::dword(0);
        
        if (
$filename)
        {
            
$f fopen($filename"wb");
            foreach (
$header AS $h)
            {
                
fwrite($f$h);
            }
            
            
//save pixels
            
for ($y=$hei-1$y>=0$y--)
            {
                for (
$x=0$x<$wid$x++)
                {
                    
$rgb imagecolorat($img$x$y);
                    
fwrite($fself::byte3($rgb));
                }
                
fwrite($f$wid_pad);
            }
            
fclose($f);
        }
        else
        {
            foreach (
$header AS $h)
            {
                echo 
$h;
            }
            
            
//save pixels
            
for ($y=$hei-1$y>=0$y--)
            {
                for (
$x=0$x<$wid$x++)
                {
                    
$rgb imagecolorat($img$x$y);
                    echo 
self::byte3($rgb);
                }
                echo 
$wid_pad;
            }
        }
        return 
true;
    }
    
    public static function 
imagecreatefromstring($data)
    {
        
//read header    
        
$pos 0;
        
$header substr($data054);
        
$pos 54;
        
        if (
strlen($header) < 54)
            return 
false;
        
        
$header unpack(    'c2identifier/Vfile_size/Vreserved/Vbitmap_data/Vheader_size/' .
                            
'Vwidth/Vheight/vplanes/vbits_per_pixel/Vcompression/Vdata_size/'.
                            
'Vh_resolution/Vv_resolution/Vcolors/Vimportant_colors'$header);
    
        if (
$header['identifier1'] != 66 or $header['identifier2'] != 77)
        {
            return 
false;
            
//die('Not a valid bmp file');
        
}
        
        if (!
in_array($header['bits_per_pixel'], array(2432841)))
        {
            return 
false;
            
//die('Only 1, 4, 8, 24 and 32 bit BMP images are supported');
        
}
        
        
$bps $header['bits_per_pixel']; //bits per pixel 
        
$wid2 ceil(($bps/$header['width']) / 4) * 4;
        
$colors pow(2$bps);
    
        
$wid $header['width'];
        
$hei $header['height'];
    
        
$img imagecreatetruecolor($header['width'], $header['height']);
    
        
//read palette
        
if ($bps 9)
        {
            for (
$i=0$i<$colors$i++)
            {
                
$palette[] = self::undword(substr($data$pos4));
                
$pos += 4;
            }
        }
        else
        {
            if (
$bps == 32)
            {
                
imagealphablending($imgfalse);
                
imagesavealpha($imgtrue);            
            }
            
$palette = array();
        }    
    
        
//read pixels    
        
for ($y=$hei-1$y>=0$y--)
        {
            
$row substr($data$pos$wid2);
            
$pos += $wid2;        
            
$pixels self::str_split2($row$bps$palette);
            for (
$x=0$x<$wid$x++)
            {
                
self::makepixel($img$x$y$pixels[$x], $bps);
            }
        }
        
        return 
$img;
    }
    
    public static function 
imagecreatefrombmp($filename)
    {
        return 
self::imagecreatefromstring(file_get_contents($filename));
    }
    
    private static function 
str_split2($row$bps$palette)
    {
        switch (
$bps)
        {
            case 
32:
            case 
24:    return str_split($row$bps/8);
            case  
8:    $out = array();
                        
$count strlen($row);                
                        for (
$i=0$i<$count$i++)
                        {                    
                            
$out[] = $palette[    ord($row[$i])        ];
                        }                
                        return 
$out;        
            case  
4:    $out = array();
                        
$count strlen($row);                
                        for (
$i=0$i<$count$i++)
                        {
                            
$roww ord($row[$i]);                        
                            
$out[] = $palette[    ($roww 240) >> 4    ];
                            
$out[] = $palette[    ($roww 15)         ];
                        }                
                        return 
$out;
            case  
1:    $out = array();
                        
$count strlen($row);                
                        for (
$i=0$i<$count$i++)
                        {
                            
$roww ord($row[$i]);                        
                            
$out[] = $palette[    ($roww 128) >> 7    ];
                            
$out[] = $palette[    ($roww 64) >> 6    ];
                            
$out[] = $palette[    ($roww 32) >> 5    ];
                            
$out[] = $palette[    ($roww 16) >> 4    ];
                            
$out[] = $palette[    ($roww 8) >> 3    ];
                            
$out[] = $palette[    ($roww 4) >> 2    ];
                            
$out[] = $palette[    ($roww 2) >> 1    ];
                            
$out[] = $palette[    ($roww 1)            ];
                        }                
                        return 
$out;                    
        }
    }
    
    private static function 
makepixel($img$x$y$str$bps)
    {
        switch (
$bps)
        {
            case 
32 :    $a ord($str[0]);
                        
$b ord($str[1]);
                        
$c ord($str[2]);
                        
$d 256 ord($str[3]); //TODO: gives imperfect results
                        
$pixel $d*256*256*256 $c*256*256 $b*256 $a;
                        
imagesetpixel($img$x$y$pixel);
                        break;
            case 
24 :    $a ord($str[0]);
                        
$b ord($str[1]);
                        
$c ord($str[2]);
                        
$pixel $c*256*256 $b*256 $a;
                        
imagesetpixel($img$x$y$pixel);
                        break;                    
            case 
:
            case 
:
            case 
:    imagesetpixel($img$x$y$str);
                        break;
        }
    }
    
    private static function 
byte3($n)
    {
        return 
chr($n 255) . chr(($n >> 8) & 255) . chr(($n >> 16) & 255);    
    }
    
    private static function 
undword($n)
    {
        
$r unpack("V"$n);
        return 
$r[1];
    }
    
    private static function 
dword($n)
    {
        return 
pack("V"$n);
    }
    
    private static function 
word($n)
    {
        return 
pack("v"$n);
    }
}
Онлайн: 2
Реклама