Esempio n. 1
0
/**
 * 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);
}
Esempio n. 2
0
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);
}