/** * Reads image from a BMP file and converts it to image resource * @global int $jpexs_CurrentBit Internal variable * @param string $file File to read BMP image from * @return resource Image resource or false on error * * Note: * Reading RLE compressed bitmaps is EXPERIMENTAL * Reading palette based bitmaps with less than 8bit palette is EXPERIMENTAL */ function imagecreatefrombmp($file) { global $jpexs_CurrentBit; $f = fopen($file, "r"); $Header = fread($f, 2); if ($Header == "BM") { $Size = jpexs_freaddword($f); $Reserved1 = jpexs_freadword($f); $Reserved2 = jpexs_freadword($f); $FirstByteOfImage = jpexs_freaddword($f); $SizeBITMAPINFOHEADER = jpexs_freaddword($f); $Width = jpexs_freaddword($f); $Height = jpexs_freaddword($f); $biPlanes = jpexs_freadword($f); $biBitCount = jpexs_freadword($f); $RLECompression = jpexs_freaddword($f); $WidthxHeight = jpexs_freaddword($f); $biXPelsPerMeter = jpexs_freaddword($f); $biYPelsPerMeter = jpexs_freaddword($f); $NumberOfPalettesUsed = jpexs_freaddword($f); $NumberOfImportantColors = jpexs_freaddword($f); if ($biBitCount < 24) { $img = imagecreate($Width, $Height); $Colors = pow(2, $biBitCount); for ($p = 0; $p < $Colors; $p++) { $B = jpexs_freadbyte($f); $G = jpexs_freadbyte($f); $R = jpexs_freadbyte($f); $Reserved = jpexs_freadbyte($f); $Palette[] = imagecolorallocate($img, $R, $G, $B); } if ($RLECompression == 0) { $Zbytek = (4 - ceil($Width / (8 / $biBitCount)) % 4) % 4; for ($y = $Height - 1; $y >= 0; $y--) { $jpexs_CurrentBit = 0; for ($x = 0; $x < $Width; $x++) { $C = jpexs_freadbits($f, $biBitCount); imagesetpixel($img, $x, $y, $Palette[$C]); } if ($jpexs_CurrentBit != 0) { jpexs_freadbyte($f); } for ($g = 0; $g < $Zbytek; $g++) { jpexs_freadbyte($f); } } } } if ($RLECompression == 1) { $y = $Height; $pocetb = 0; while (true) { $y--; $prefix = jpexs_freadbyte($f); $suffix = jpexs_freadbyte($f); $pocetb += 2; $echoit = false; if ($echoit) { echo "Prefix: {$prefix} Suffix: {$suffix}<BR>"; } if ($prefix == 0 and $suffix == 1) { break; } if (feof($f)) { break; } while (!($prefix == 0 and $suffix == 0)) { if ($prefix == 0) { $pocet = $suffix; $Data .= fread($f, $pocet); $pocetb += $pocet; if ($pocetb % 2 == 1) { jpexs_freadbyte($f); $pocetb++; } } if ($prefix > 0) { $pocet = $prefix; for ($r = 0; $r < $pocet; $r++) { $Data .= chr($suffix); } } $prefix = jpexs_freadbyte($f); $suffix = jpexs_freadbyte($f); $pocetb += 2; if ($echoit) { echo "Prefix: {$prefix} Suffix: {$suffix}<BR>"; } } for ($x = 0; $x < strlen($Data); $x++) { imagesetpixel($img, $x, $y, $Palette[ord($Data[$x])]); } $Data = ""; } } if ($RLECompression == 2) { $y = $Height; $pocetb = 0; /*while(!feof($f)) echo freadbyte($f)."_".freadbyte($f)."<BR>";*/ while (true) { //break; $y--; $prefix = jpexs_freadbyte($f); $suffix = jpexs_freadbyte($f); $pocetb += 2; $echoit = false; if ($echoit) { echo "Prefix: {$prefix} Suffix: {$suffix}<BR>"; } if ($prefix == 0 and $suffix == 1) { break; } if (feof($f)) { break; } while (!($prefix == 0 and $suffix == 0)) { if ($prefix == 0) { $pocet = $suffix; $jpexs_CurrentBit = 0; for ($h = 0; $h < $pocet; $h++) { $Data .= chr(jpexs_freadbits($f, 4)); } if ($jpexs_CurrentBit != 0) { jpexs_freadbits($f, 4); } $pocetb += ceil($pocet / 2); if ($pocetb % 2 == 1) { jpexs_freadbyte($f); $pocetb++; } } if ($prefix > 0) { $pocet = $prefix; $i = 0; for ($r = 0; $r < $pocet; $r++) { if ($i % 2 == 0) { $Data .= chr($suffix % 16); } else { $Data .= chr(floor($suffix / 16)); } $i++; } } $prefix = jpexs_freadbyte($f); $suffix = jpexs_freadbyte($f); $pocetb += 2; if ($echoit) { echo "Prefix: {$prefix} Suffix: {$suffix}<BR>"; } } for ($x = 0; $x < strlen($Data); $x++) { imagesetpixel($img, $x, $y, $Palette[ord($Data[$x])]); } $Data = ""; } } if ($biBitCount == 24) { $img = imagecreatetruecolor($Width, $Height); $Zbytek = $Width % 4; for ($y = $Height - 1; $y >= 0; $y--) { for ($x = 0; $x < $Width; $x++) { $B = jpexs_freadbyte($f); $G = jpexs_freadbyte($f); $R = jpexs_freadbyte($f); $color = imagecolorexact($img, $R, $G, $B); if ($color == -1) { $color = imagecolorallocate($img, $R, $G, $B); } imagesetpixel($img, $x, $y, $color); } for ($z = 0; $z < $Zbytek; $z++) { jpexs_freadbyte($f); } } } return $img; } else { return false; } fclose($f); }
function jpexs_readIcon($filename, $id, &$Ikona) { global $jpexs_currentBit; $f = fopen($filename, "rb"); fseek($f, 6 + $id * 16); $Width = jpexs_freadbyte($f); $Height = jpexs_freadbyte($f); fseek($f, 6 + $id * 16 + 12); $OffSet = jpexs_freaddword($f); fseek($f, $OffSet); $p = $id; $Ikona[$p]["Info"]["HeaderSize"] = jpexs_freadlngint($f); $Ikona[$p]["Info"]["ImageWidth"] = jpexs_freadlngint($f); $Ikona[$p]["Info"]["ImageHeight"] = jpexs_freadlngint($f); $Ikona[$p]["Info"]["NumberOfImagePlanes"] = jpexs_freadword($f); $Ikona[$p]["Info"]["BitsPerPixel"] = jpexs_freadword($f); $Ikona[$p]["Info"]["CompressionMethod"] = jpexs_freadlngint($f); $Ikona[$p]["Info"]["SizeOfBitmap"] = jpexs_freadlngint($f); $Ikona[$p]["Info"]["HorzResolution"] = jpexs_freadlngint($f); $Ikona[$p]["Info"]["VertResolution"] = jpexs_freadlngint($f); $Ikona[$p]["Info"]["NumColorUsed"] = jpexs_freadlngint($f); $Ikona[$p]["Info"]["NumSignificantColors"] = jpexs_freadlngint($f); $biBitCount = $Ikona[$p]["Info"]["BitsPerPixel"]; if ($Ikona[$p]["Info"]["BitsPerPixel"] <= 8) { $barev = pow(2, $biBitCount); for ($b = 0; $b < $barev; $b++) { $Ikona[$p]["Paleta"][$b]["b"] = jpexs_freadbyte($f); $Ikona[$p]["Paleta"][$b]["g"] = jpexs_freadbyte($f); $Ikona[$p]["Paleta"][$b]["r"] = jpexs_freadbyte($f); jpexs_freadbyte($f); } $Zbytek = (4 - ceil($Width / (8 / $biBitCount)) % 4) % 4; for ($y = $Height - 1; $y >= 0; $y--) { $jpexs_currentBit = 0; for ($x = 0; $x < $Width; $x++) { $C = jpexs_freadbits($f, $biBitCount); $Ikona[$p]["Data"][$x][$y] = $C; } if ($jpexs_currentBit != 0) { jpexs_freadbyte($f); } for ($g = 0; $g < $Zbytek; $g++) { jpexs_freadbyte($f); } } } elseif ($biBitCount == 24) { $Zbytek = $Width % 4; for ($y = $Height - 1; $y >= 0; $y--) { for ($x = 0; $x < $Width; $x++) { $B = jpexs_freadbyte($f); $G = jpexs_freadbyte($f); $R = jpexs_freadbyte($f); $Ikona[$p]["Data"][$x][$y]["r"] = $R; $Ikona[$p]["Data"][$x][$y]["g"] = $G; $Ikona[$p]["Data"][$x][$y]["b"] = $B; } for ($z = 0; $z < $Zbytek; $z++) { jpexs_freadbyte($f); } } } elseif ($biBitCount == 32) { $Zbytek = $Width % 4; for ($y = $Height - 1; $y >= 0; $y--) { for ($x = 0; $x < $Width; $x++) { $B = jpexs_freadbyte($f); $G = jpexs_freadbyte($f); $R = jpexs_freadbyte($f); $Alpha = jpexs_freadbyte($f); $Ikona[$p]["Data"][$x][$y]["r"] = $R; $Ikona[$p]["Data"][$x][$y]["g"] = $G; $Ikona[$p]["Data"][$x][$y]["b"] = $B; $Ikona[$p]["Data"][$x][$y]["alpha"] = $Alpha; } for ($z = 0; $z < $Zbytek; $z++) { jpexs_freadbyte($f); } } } //Maska $Zbytek = (4 - ceil($Width / 8) % 4) % 4; for ($y = $Height - 1; $y >= 0; $y--) { $jpexs_currentBit = 0; for ($x = 0; $x < $Width; $x++) { $C = jpexs_freadbits($f, 1); $Ikona[$p]["Maska"][$x][$y] = $C; } if ($jpexs_currentBit != 0) { jpexs_freadbyte($f); } for ($g = 0; $g < $Zbytek; $g++) { jpexs_freadbyte($f); } } //-------------- fclose($f); }