imagecreatefrombmp in 32bit BMP

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • mingkin
    New Member
    • Sep 2007
    • 5

    imagecreatefrombmp in 32bit BMP

    [php]<?php

    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 );
    $height = abs($height);

    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 == 32) {
    $gd_scan_line = "";
    $j = 0;
    while($j < $scan_line_size ) {
    $b = $scan_line{$j++ };
    $g = $scan_line{$j++ };
    $r = $scan_line{$j++ };
    $a = chr(255 - ord($scan_line{ $j++}));
    $gd_scan_line .= "$a$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("1.bmp");
    imagegif($img, "test.gif") ;

    ?>

    <img src="test.gif" border="0" />[/php]

    On the other bits BMP(such as 24-bit), it is not problem to process.
    But in the 32-bit BMP, will output the error image(on under).
    How to fix it?

  • pbmods
    Recognized Expert Expert
    • Apr 2007
    • 5821

    #2
    Heya, Ming. Welcome to TSDN!

    Try converting the file to a PNG first.

    Comment

    • mingkin
      New Member
      • Sep 2007
      • 5

      #3
      Originally posted by pbmods
      Heya, Ming. Welcome to TSDN!

      Try converting the file to a PNG first.

      http://cetus.sakura.ne.jp/softlab/b2p-home/
      Thank you.

      If i want to conver by PHP script(the follow code)?

      Comment

      • pbmods
        Recognized Expert Expert
        • Apr 2007
        • 5821

        #4
        Heya, Ming.

        If the b2p tool will do the job, you can invoke it using the exec() function.

        Comment

        • mingkin
          New Member
          • Sep 2007
          • 5

          #5
          Originally posted by pbmods
          Heya, Ming.

          If the b2p tool will do the job, you can invoke it using the exec() function.
          if i want to cross-platform?

          Comment

          Working...