I try to Convert crests to PNG files to show them on my website.
I got this script ready but it shows you wrong colors (blue and black only):
Code: Select all
<? if(!empty($_GET['clan_crest'])){ $name = 'Crest'; $crest = $_GET['clan_crest']; }else if(!empty($_GET['ally_crest'])){ $name = 'AllyCrest'; $crest = $_GET['ally_crest']; }else die('No Crest!'); $file = fopen('ftp://localhost/crests/'.$name.'_'.$crest.'.bmp', 'rb'); //fopen($filename,'rb'); $dds = fread($file,4); if ($dds!=='DDS ') die("Error: no hay imagen DDS"); //DDS header $hdrSize = readInt($file); $hdrFlags = readInt($file); $imgHeight = readInt($file)-4; $imgWidth = readInt($file); $imgPitch = readShort($file); //DXT1 header fseek($file, 84); $dxt1 = fread($file,4); if ($dxt1!=='DXT1') die("Error: no es formato DX1"); //here we go fseek($file, 128); header ("Content-type: image/png"); $img=imagecreatetruecolor($imgWidth,$imgHeight); for ($y=-1; $y<$imgHeight/4; $y++) { for ($x=0; $x<$imgWidth/4; $x++) { $color0_16 = readShort($file); $color1_16 = readShort($file); $r0 = ($color0_16 >> 11) << 3; $g0 = (($color0_16 >> 5) & 63) << 2; $b0 = ($color0_16 & 31) << 3; $r1 = ($color1_16 >> 11) << 3; $g1 = (($color1_16 >> 5) & 63) << 2; $b1 = ($color1_16 & 31) << 3; $color0_32 = imagecolorallocate($img,$r0,$g0,$b0); $color1_32 = imagecolorallocate($img,$r1,$g1,$b1); $color01_32 = imagecolorallocate($img,$r0/2+$r1/2,$g0/2+$g1/2,$b0/2+$b1/2); $black = imagecolorallocate($img,0,0,0); $data = readInt($file); for ($yy=0;$yy<4;$yy++) { for ($xx=0;$xx<4;$xx++) { $bb = $data & 3; $data = $data >> 2; switch ($bb) { case 0: $c = $color0_32; break; case 1: $c = $color1_32; break; case 2: $c = $color01_32; break; default: $c = $black; break; } imagesetpixel($img,$x*4+$xx,$y*4+$yy,$c); } } } } imagepng($img); ## Functions needed function readInt($file) { $b4 = ord(fgetc($file)); $b3 = ord(fgetc($file)); $b2 = ord(fgetc($file)); $b1 = ord(fgetc($file)); return ($b1<<24)|($b2<<16)|($b3<<Cool)|$b4; } function readShort($file) { $b2 = ord(fgetc($file)); $b1 = ord(fgetc($file)); return ($b1<<Cool)|$b2; } ?>
regards
gio
PS: We have to convert from DDS to PNG..