views:

485

answers:

0

Hi. I need to convert resource image to 24-bit BMP image with GD2. This code creates 32-bit BMP image, but I need 24-bit. Help please.

function imagebmp(&$im)
    {
     if (!$im) return null;
     $w = imagesx($im);
     $h = imagesy($im);
     $result = '';
     if (!imageistruecolor($im)) {
      $tmp = imagecreatetruecolor($w, $h);
      imagecopy($tmp, $im, 0, 0, 0, 0, $w, $h);
      imagedestroy($im);
      $im = & $tmp;
     }
     $biBPLine = $w * 2;
     $biStride = ($biBPLine + 3) & ~3;
     $biSizeImage = $biStride * $h;
     $bfOffBits = 66;
     $bfSize = $bfOffBits + $biSizeImage;
     $result .= substr('BM', 0, 2);
     $result .= pack ('VvvV', $bfSize, 0, 0, $bfOffBits);
     $result .= pack ('VVVvvVVVVVV', 40, $w, '-'.$h, 1, 16, 3, $biSizeImage, 0, 0, 0, 0);
     $numpad = $biStride - $biBPLine;
     $result .= pack('VVV',63488,2016,31);
     for ($y = 0; $y < $h; ++$y) {
      for ($x = 0; $x < $w; ++$x) {
       $rgb = imagecolorat($im, $x, $y);
       $r24 = ($rgb >> 16) & 0xFF;
       $g24 = ($rgb >> 8) & 0xFF;
       $b24 = $rgb & 0xFF;
       $col = ((($r24 >> 3) << 11) | (($g24 >> 2) << 5) | ($b24 >> 3));
       $result .= pack('v',$col);
      }
     for ($i = 0; $i < $numpad; ++$i)
      $result .= pack ('C', 0);
     }
     return $result;
    }