PHP Code:
<?php
function BMPToGD($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) {
return false;
}
$palette_size = $offset - 54;
$ncolor = $palette_size / 4;
$gd_header = "";
$gd_header .= ($palette_size == 0) ? "\xFF\xFE" : "\xFF\xFF";
$gd_header .= pack("n2", $width, $height);
$gd_header .= ($palette_size == 0) ? "\x01" : "\x00";
if ($palette_size) {
$gd_header .= pack("n", $ncolor);
}
$gd_header .= "\xFF\xFF\xFF\xFF";
fwrite($dest_f, $gd_header);
if ($palette_size) {
$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("\x00\x00\x00\x00", 256 - $ncolor);
fwrite($dest_f, $gd_palette);
}
$scan_line_size = (($bits * $width) + 7) >> 3;
$scan_line_align = ($scan_line_size & 0x03) ? 4 - ($scan_line_size & 0x03) : 0;
for ($i = 0, $l = $height - 1; $i < $height; $i++, $l--) {
fseek($src_f, $offset + (($scan_line_size + $scan_line_align) * $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";
}
} elseif ($bits == 8) {
$gd_scan_line = $scan_line;
} elseif ($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);
} elseif ($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$p5$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 imagecreatefrombmp($filename) {
$tmp_name = tempnam("/tmp", "GD");
if (BMPToGD($filename, $tmp_name)) {
$img = imagecreatefromgd($tmp_name);
unlink($tmp_name);
return $img;
}
return false;
}
function ColorToRGB($color, &$r, &$g, &$b) {
$r = $color & 255;
$g = ($color >> 8) & 255;
$b = ($color >> 16) & 255;
}
function RGBToColor($r, $g, $b) {
return $r | ($g << 8) | ($b << 16);
}
function InvertRGB(&$r, &$g, &$b) {
$r = (255 - $r);
$g = (255 - $g);
$b = (255 - $b);
}
function InvertColor($color) {
$r = $color & 255; $g = ($color >> 8) & 255; $b = ($color >> 16) & 255;
$r = (255 - $r); $g = (255 - $g); $b = (255 - $b);
return $r | ($g << 8) | ($b << 16);
}
function BMPStringToByteArray($string, $width, $height) {
if (substr($string, 0, 1) == "m") {
$data_array = str_split(gzuncompress(base64_decode(substr($string, 1, strlen($string) - 1))));
$o = 1; $mode = R; $result = array();
$result["W"] = $width;
$result["H"] = $height;
foreach ($data_array as $bit) {
switch ($mode) {
case R: $r = $bit; $mode = G; break;
case G: $g = $bit; $mode = B; break;
case B: $b = $bit; $mode = R; $result[$o] = array(ord($r), ord($g), ord($b)); $o++; break;
}
}
return $result;
} else {
return false;
}
}
function ByteArrayToBMP($bytearray) {
$width = $bytearray["W"];
$height = $bytearray["H"];
unset($bytearray["W"], $bytearray["H"]);
$img = imagecreatetruecolor($width, $height);
$sx = 0;
$sy = 0;
foreach ($bytearray as $bits) {
$color = imagecolorallocate($img, $bits[0], $bits[1], $bits[2]);
imagesetpixel($img, $sx, $sy, $color);
$sx++;
if ($sx == $width) {
$sy++;
$sx = 0;
}
}
header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);
}
function BMPToByteArray($bmp_path) {
$img = imagecreatefrombmp($bmp_path);
if (!$img) {
return array(0 => array(0, 0, 0));
exit;
}
$width = imagesx($img);
$height = imagesy($img);
$sy = 0;
$sx = 0;
$result = array();
$result["W"] = $width;
$result["H"] = $height;
$pixels = $width * $height;
for ($i = 0; $i != $pixels; $i++) {
$rgb = imagecolorat($img, $sx, $sy);
ColorToRGB($rgb, $b, $g, $r);
$result[$i] = array($r, $g, $b);
$sx++;
if ($sx == $width) {
$sy++;
$sx = 0;
}
}
return $result;
}
function ByteArrayToString($bytearray) {
$result = "";
$width = $bytearray["W"];
$height = $bytearray["H"];
unset($bytearray["W"], $bytearray["H"]);
foreach ($bytearray as $byte) {
$result .= $byte;
}
return "m".base64_encode(gzcompress($result))." W: ".$width." H: ".$height;
}
$string = 'meJzlm0tTG9kVx5MFu2SbfIMsMsv5AvlkSU05UDaWLUtgCaEHaks0avRWo6dbFggEiPdgGLA9nrFnJpNKavKoyiLL5C8f+8xxC4lG3RIyUL9SiW6p1b++955zbj8mfvHLidHyn3/+a399FXzz/EiCJbVcBmtHvD/d/PeHHxmnlNmaGRNZ7EMiEgIO+vKW4ciMRvbSX2Ffwqm9oqMnt+zswexFfwVTEwCnlMfQl2S7R5kjytfly/svgxJg2QujqH3l6/Ll/ZdQ1yXZf//lO4lUtrOHFKKVOR8zmnjF+9/N8Hw7MXAhZGI0yqxwIcPwJdmMGjMxGmW26IWzvixbTGkmpLLjFY7J1zqvjg52VuuVbGqAhsDOx4J+TYnkEvFKLlXOJCVYiFX4QGjWI7H4QxYP0WC+g/W6/r5YQsoD+OIz4cdeps9XBvAdeIhZ9MVn0osKc6ky1uIr8VCAWfDN9vrKVX3txJNLfVlZTybqxTzRX5lk8ZVkLMqo4WAvZSuO//juW2bYvqRcK2Q2npb3W6tAKncXRbzBwrLKpOMKK5u+YiUmS9+XR3t2+jN2u7OHTyI5LZ5Zin1E4mcq+VSzVtrbaJzub281auVsUl0I+twuE2GfNx4OJONROP76d5/rqQT4ze//0An10RDezHvdclwDK2nX5NtuGAPHK4u+WMvKZ4dtVjbR7QtH0Cjp+Begb5uyvJXK6lp8WRldmpVNoJ+z769++xm3L3zxiu9CGe8lpu7N44JnCvD96c1rky+G2wBVwVV9SXnDKLOyiXopD0H2BdS+xHG7Bd/Dzaak176ZfJmz/XbLqOrLidi8HwGBsZglfY9cYb83Huk0ihaLSBJPQoxcrqcT8Go9qx5uN4/a65L2mrFWWynnknygyLQT7owydelXxweSPvvGY1n6/vX1C1bOLcUZK1kSn7HpCzsJKTcqOil3IlUiRpoEOoZF3wlxVg01hvRl5Wa1xHDKuNCaZNGTIWvTt5BUmebTEpS3VmukTI0LTbyih1Mro1db9GVlFJCsTL6kfLzdYmSWNA1tlsWwhSlhxzcW8hNYhSVYzsrUviROyu1VQypfGmEAohNiFCLV3998/ePX58ybs2Nmb71h6FnEf6Q8ILPknOfBwtws0kdaVaRUfCEgiYX9jFwOhXI+2ajq7aZRL+fx70Jg1n1vEuAN/jVK2Z2N+ka9bBSzOAI4klDm4TwkX2yKlTsVnciSDvrutRqsDDA00ktKbSWDVejbNT2D1jf5Uq/GG0R44KAvKwOZJdEnHfRlZQDZbl/8HPlyrKbYNQxfUgYyS1YKKfz6kHyTi1Fsf2uthoHMvkjEsn3xikBN1laSJtiq184Pdv/27avvX5wyr08OGTp6xPFuS7LxrIwhVkh19kSKREM+SWR+llkQdPuSMsBm0bhY22pUEa8gzr6m2sO6L1uT8gC++1urrNzLV8qafNGIxZxWr+Rbq9WtZo2BI8CW0bI4GhBHsMKH1WiQYzvGMgbUWnVlp1k/2d1Ex7Poy8pIPQP4sjL256q++CQrS9DcgJXxihZHW6M/oJXhTmCixLkYgcW6LymjtGDlK/mSMnabla37srIEbUqdnJQxhAGWoFcjMRFI3JBVAj40dDGjIXFcyZeUMctA4Y0YdX60y5zsbTIoACTYJfu+pCxBU/K4hjI1dydQGyUUJwxaFrLzM27MpAab1rGydV+mVszk06oWj8AxNOdl5h67JfN+DyPdZQwnax7a8le4RwHkKfRqVHSzD6ftXCCAMmr16/Wljt3ti47E3BJfxEYCSdm+LyljMs7KY+iL9AdyWhzj174vvouSCdkNFRRispyGc1VAYGeYUiGZ1mKLShBBSQrOeFy9kB+Th2gpFsol46Cip1aNFdmHGzW9k5i0mKoEYYoyG/Nuz/SUTd+wz4s5IGI+qhfMyBhESIlMmvD934e/T9EXQV5PJZDKUc4xKHUkMmmicZ31heyIfTE6kOOQzRkaOIxMmujJN8C3c0pfVRg5CQIyyMgd9s08YDzu6V5Id/mVhZAPYTeXVkGlmHlW0xkEKz2TSKrRm+SLLcSVIAYI0HNatZipfrBm3/c/6vMgOLvvTX7qvkrEb/IlbrAvd2lEfgaDd0x85aSgj+8D1xTT35e7NMoYBrIIVp+or1zuFQT8nvD8bDTiX4yFgKZGGTQ6EsGTSOfnwijesP37U/envripvmhitPiyGoX1LfHFKCZrpCRHfDFfeH+WdVFBiSWv7smrA/i5q/pKWTu+CNR4RU2iBH02fSELzUQ0lFmKoaAyVrJ9fCXynIYsnKSIqa3lKhm7pK+UBdlkfCWnlfWUUckjdlETD3xbAsnWi3nMB0GjrF+Lr5RFrSVBpEK1ufxO3I4snYum24Skb+tZVV6EHZkvyaa0WGwhAHh0BB67A++KbYjbbFluXMwBMdknDrea8rrzKH0hm02rSEBg3u9x3b0DHk5PEjPuaTuyGTVGd0HQ+cmXx3vMTrO+Vl3B9B8jWsZq00VPeb5dnrjoM1eSq2SIi4R8S/FIJhkv6alkQgE4Am7XlCO3X2Ij+nKij+/J7iYr2/Sdn/NK4MXAiPE8vIuQhSGMLk2mJDtwxjHJtowq3+VyoS8rI2Lb9I0hi30AjchQ6iEge//unVmPKzjnJVNnZc/22/JGlwt9SblR0VnZju9yQgHosQxGK4OWhezUnT8+mJ508KmZYkrji4Nvz59L5PUUee59b6PRrJUQunNaXPZtk34vd0TaVEIByKFIoB9N5Ct5BrkG4ddORBoT38ceF6ovJFAAKemLfxnHZa/R95FrinIopKQyaRIke2N8p6e+AJCSyt2+Dsp2+/7w8ivJN6dHjLzHCeUHKi4UmZhH8J2BRK+yU7pjeu7zuNzTk+53BUO3LxYOQ3ZgXzQxK9v0vffnP6EgxKSymNPocire2ykRh+TLytSrr+SbVKPcw6EmlYcqa9OXlHkgX8kXk7j00vvzBlJ5qLJE537CtfqrLw9+evta3owEZOzqM5YH8zVKWboEI5VH9owwKZ/ubkuOttcZK7ELyKcMpHsyHmUKKbW2kmkaJbq8SHe5hP1emycYB1DeqJUla5UV4Igv304DxsGXlAuaCqQsg+nwpb5Sttu3XsoTdFVxfHwJ03MQdAbApi/dUcMXjkn2unwnPn5Gr/uRB+rbiF3yvsrOjGmtjlXlTLKY1iTUwwn5AI68NYLuY6d7nmdcd0fse2kHIOVb4svKNDu+Db4TH9+Adxt8SRkB/GRnEzUYCrPDVrNlVI1CtlbISPiBQdCRXW+c7m0j3MlpF44VfVhTInOPRlRv2FE+3m61GwZaXF82x2eJ9H355Z4EymTdUfaMuzI9rYPOnI4r8pFVE9CRvueHu8TZQZutO8pPxl2ZH8hSw0H5SLIJPZnYeFqWvjAFWEJvSHnMfSf6pmxT+pazsO9fnL49e/7mq2OTr/0m/j/3LmhS';
$bytearray = BMPStringToByteArray($string, 80, 80);
ByteArrayToBMP($bytearray);
?>