gif2bmp на php

Discussion in 'PHP' started by zEr0r, 17 May 2010.

  1. zEr0r

    zEr0r Elder - Старейшина

    Joined:
    17 Feb 2008
    Messages:
    67
    Likes Received:
    28
    Reputations:
    14
    скиньте плз сорцы у кого есть реализация на пхп (без использования библиотек)
     
  2. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    Вот класс
    PHP:
    <?php  //bmp.php
    // Read & Save 24bit BMP files
     
    // Author: de77
    // Licence: MIT
    // Webpage: de77.com
    // Version: 07.02.2010
     
    class BMP
    {
     public static function 
    imagebmp(&$img$filename false)
     {
     return 
    imagebmp($img$filename);
     }
     
     public static function 
    imagecreatefrombmp($filename)
     {
     return 
    imagecreatefrombmp($filename);
     }
    }
     
    function 
    imagebmp(&$img$filename false)
    {
     
    $wid imagesx($img);
     
    $hei imagesy($img);
     
    $wid_pad str_pad(''$wid 4"\0");
     
     
    $size 54 + ($wid $wid_pad) * $hei;
     
     
    //prepare & save header
     
    $header['identifier']        = 'BM';
     
    $header['file_size']        = dword($size);
     
    $header['reserved']            = dword(0);
     
    $header['bitmap_data']        = dword(54);
     
    $header['header_size']        = dword(40);
     
    $header['width']            = dword($wid);
     
    $header['height']            = dword($hei);
     
    $header['planes']            = word(1);
     
    $header['bits_per_pixel']    = word(24);
     
    $header['compression']        = dword(0);
     
    $header['data_size']        = dword(0);
     
    $header['h_resolution']        = dword(0);
     
    $header['v_resolution']        = dword(0);
     
    $header['colors']            = dword(0);
     
    $header['important_colors']    = 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($fbyte3($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 
    byte3($rgb);
     }
     echo 
    $wid_pad;
     }
     }
    }
     
    function 
    imagecreatefrombmp($filename)
    {
     
    $f fopen($filename"rb");
     
     
    //read header
     
    $header fread($f54);
     
    $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)
     {
     die(
    'Not a valid bmp file');
     }
     
     if (
    $header['bits_per_pixel'] != 24)
     {
     die(
    'Only 24bit BMP images are supported');
     }
     
     
    $wid2 ceil((3*$header['width']) / 4) * 4;
     
     
    $wid $header['width'];
     
    $hei $header['height'];
     
     
    $img imagecreatetruecolor($header['width'], $header['height']);
     
     
    //read pixels
     
    for ($y=$hei-1$y>=0$y--)
     {
     
    $row fread($f$wid2);
     
    $pixels str_split($row3);
     for (
    $x=0$x<$wid$x++)
     {
     
    imagesetpixel($img$x$ydwordize($pixels[$x]));
     }
     }
     
    fclose($f);            
     
     return 
    $img;
    }    
     
    function 
    dwordize($str)
    {
     
    $a ord($str[0]);
     
    $b ord($str[1]);
     
    $c ord($str[2]);
     return 
    $c*256*256 $b*256 $a;
    }
     
    function 
    byte3($n)
    {
     return 
    chr($n 255) . chr(($n >> 8) & 255) . chr(($n >> 16) & 255);
    }
    function 
    dword($n)
    {
     return 
    pack("V"$n);
    }
    function 
    word($n)
    {
     return 
    pack("v"$n);
    }
    ?>
    Чтобы конвертировать используй так:

    PHP:
    <?php
    include 'bmp_class.php'//Класс который выложен выше

    $im imagecreatefrombmp('test.bmp'); //Читаем картинку test.bmp
    imagegif($im,"image.gif"); //Сохраняем картинку в image.gif
    ?>
    У меня из 544 Кб BMP файла конвертировалось в 3.4Кб GIF
     
    1 person likes this.