is there BMP support in GD?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts

  • Chung Leong
    Guest replied
    Re: is there BMP support in GD?

    "Erwin Bon" <ernie@verkerk. nl> wrote in message news:<3fc9d260$ 0$4671$1b62eedf @news.euronet.n l>...[color=blue]
    > Hello,
    >
    > I need to be able to read windows bitmap files (*.bmp) into the GD-functions
    > in order to create a jpg-file from it. Is such a thing possible. I seem te
    > be unable to find the required functions.
    >
    > Hope you can help me.
    >
    > Regards, Erwin[/color]

    The GD library doesn't support .BMP files for some reason. I've
    written a function that converts .BMP files to .GD, a very simple
    format that GD uses.

    The following code implements imagecreatefrom bmp(). It first convert
    the BMP to GD, saving it to a temporary location, then open the image
    using imagecreatefrom gd().


    <?

    function ConvertBMP2GD($ src, $dest = false) {
    if(!($src_f = fopen($src, "rb"))) {
    return false;
    }
    if(!($dest_f = fopen($dest, "wb"))) {
    return false;
    }
    $header = unpack("vtype/Vsize/v2reserved/Voffset", fread($src_f,
    14));
    $info = unpack("Vsize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vncolor/Vimportant",
    fread($src_f, 40));

    extract($info);
    extract($header );

    if($type != 0x4D42) { // signature "BM"
    return false;
    }

    $palette_size = $offset - 54;
    $ncolor = $palette_size / 4;
    $gd_header = "";
    // true-color vs. palette
    $gd_header .= ($palette_size == 0) ? "\xFF\xFE" : "\xFF\xFF";
    $gd_header .= pack("n2", $width, $height);
    $gd_header .= ($palette_size == 0) ? "\x01" : "\x00";
    if($palette_siz e) {
    $gd_header .= pack("n", $ncolor);
    }
    // no transparency
    $gd_header .= "\xFF\xFF\xFF\x FF";

    fwrite($dest_f, $gd_header);

    if($palette_siz e) {
    $palette = fread($src_f, $palette_size);
    $gd_palette = "";
    $j = 0;
    while($j < $palette_size) {
    $b = $palette{$j++};
    $g = $palette{$j++};
    $r = $palette{$j++};
    $a = $palette{$j++};
    $gd_palette .= "$r$g$b$a";
    }
    $gd_palette .= str_repeat("\x0 0\x00\x00\x00", 256 - $ncolor);
    fwrite($dest_f, $gd_palette);
    }

    $scan_line_size = (($bits * $width) + 7) >> 3;
    $scan_line_alig n = ($scan_line_siz e & 0x03) ? 4 - ($scan_line_siz e &
    0x03) : 0;

    for($i = 0, $l = $height - 1; $i < $height; $i++, $l--) {
    // BMP stores scan lines starting from bottom
    fseek($src_f, $offset + (($scan_line_si ze + $scan_line_alig n) *
    $l));
    $scan_line = fread($src_f, $scan_line_size );
    if($bits == 24) {
    $gd_scan_line = "";
    $j = 0;
    while($j < $scan_line_size ) {
    $b = $scan_line{$j++ };
    $g = $scan_line{$j++ };
    $r = $scan_line{$j++ };
    $gd_scan_line .= "\x00$r$g$b ";
    }
    }
    else if($bits == 8) {
    $gd_scan_line = $scan_line;
    }
    else if($bits == 4) {
    $gd_scan_line = "";
    $j = 0;
    while($j < $scan_line_size ) {
    $byte = ord($scan_line{ $j++});
    $p1 = chr($byte >> 4);
    $p2 = chr($byte & 0x0F);
    $gd_scan_line .= "$p1$p2";
    }
    $gd_scan_line = substr($gd_scan _line, 0, $width);
    }
    else if($bits == 1) {
    $gd_scan_line = "";
    $j = 0;
    while($j < $scan_line_size ) {
    $byte = ord($scan_line{ $j++});
    $p1 = chr((int) (($byte & 0x80) != 0));
    $p2 = chr((int) (($byte & 0x40) != 0));
    $p3 = chr((int) (($byte & 0x20) != 0));
    $p4 = chr((int) (($byte & 0x10) != 0));
    $p5 = chr((int) (($byte & 0x08) != 0));
    $p6 = chr((int) (($byte & 0x04) != 0));
    $p7 = chr((int) (($byte & 0x02) != 0));
    $p8 = chr((int) (($byte & 0x01) != 0));
    $gd_scan_line .= "$p1$p2$p3$p4$p 5$p6$p7$p8";
    }
    $gd_scan_line = substr($gd_scan _line, 0, $width);
    }

    fwrite($dest_f, $gd_scan_line);
    }
    fclose($src_f);
    fclose($dest_f) ;
    return true;
    }

    function imagecreatefrom bmp($filename) {
    $tmp_name = tempnam("/tmp", "GD");
    if(ConvertBMP2G D($filename, $tmp_name)) {
    $img = imagecreatefrom gd($tmp_name);
    unlink($tmp_nam e);
    return $img;
    }
    return false;
    }

    $img = imagecreatefrom bmp("test24bit. bmp");
    imagejpeg($img, "test.jpg") ;

    ?>
    <img src="test.jpg">

    Leave a comment:


  • Spidah
    Guest replied
    Re: is there BMP support in GD?

    All I can see in the php manual is support for .wbmp files.

    Hamilton

    "Erwin Bon" <ernie@verkerk. nl> wrote in message
    news:3fc9d260$0 $4671$1b62eedf@ news.euronet.nl ...[color=blue]
    > Hello,
    >
    > I need to be able to read windows bitmap files (*.bmp) into the[/color]
    GD-functions[color=blue]
    > in order to create a jpg-file from it. Is such a thing possible. I seem te
    > be unable to find the required functions.
    >
    > Hope you can help me.
    >
    > Regards, Erwin
    >
    >[/color]


    Leave a comment:


  • Erwin Bon
    Guest started a topic is there BMP support in GD?

    is there BMP support in GD?

    Hello,

    I need to be able to read windows bitmap files (*.bmp) into the GD-functions
    in order to create a jpg-file from it. Is such a thing possible. I seem te
    be unable to find the required functions.

    Hope you can help me.

    Regards, Erwin


Working...