Imagecreatefrombmp et imagebmp

Description

La fonction imagecreatefrombmp retourne un identifiant d'image représentant une image obtenue à partir d'un fichier bmp 16, 24 ou 32 bits.
La fonction imagebmp envoie l'image GD (image) au format BMP 24 bits sur la sortie standard (typiquement, le navigateur web : header("Content-type:image/bmp"); ) ou dans un fichier s'il est défini.
La fonction infosbmp retourne les infos concernant un bmp.

Source / Exemple :


function imagecreatefrombmp($dir) {
	$bmp = "";
	if (file_exists($dir)) {
		$file = fopen($dir,"r");
		while(!feof($file)) $bmp .= fgets($file,filesize($dir));
		if (substr($bmp,0,2) == "BM") {
			// Lecture du header
			$header = unpack("vtype/Vlength/v2reserved/Vbegin/Vsize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vncolor/Vimportant", $bmp);
			extract($header);
			// Lecture de l'image
			$im = imagecreatetruecolor($width,$height);
			$i = 0;
			$diff = floor(($imagesize - ($width*$height*($bits/8)))/$height);
			for($y=$height-1;$y>=0;$y--) {
				for($x=0;$x<$width;$x++) {
					if ($bits == 32) {
						$b = ord(substr($bmp,$begin+$i,1));
						$v = ord(substr($bmp,$begin+$i+1,1));
						$r = ord(substr($bmp,$begin+$i+2,1));
						$i += 4;
					} else if ($bits == 24) {
						$b = ord(substr($bmp,$begin+$i,1));
						$v = ord(substr($bmp,$begin+$i+1,1));
						$r = ord(substr($bmp,$begin+$i+2,1));
						$i += 3;
					} else if ($bits == 16) {
						$tot1 = decbin(ord(substr($bmp,$begin+$i,1)));
						while(strlen($tot1)<8) $tot1 = "0".$tot1;
						$tot2 = decbin(ord(substr($bmp,$begin+$i+1,1)));
						while(strlen($tot2)<8) $tot2 = "0".$tot2;
						$tot = $tot2.$tot1;
						$r = bindec(substr($tot,1,5))*8;
						$v = bindec(substr($tot,6,5))*8;
						$b = bindec(substr($tot,11,5))*8;
						$i += 2;
					}
					$col = imagecolorexact($im,$r,$v,$b);
					if ($col == -1) $col = imagecolorallocate($im,$r,$v,$b);
					imagesetpixel($im,$x,$y,$col);
				}
				$i += $diff;
			}
			// retourne l'image
			return $im;
			imagedestroy($im);
		} else return false;
	} else return false;
}

function imagebmp($im,$dir="") {
	$pix = "";
	for($y=imagesy($im)-1;$y>=0;$y--) {
		for($x=0;$x<imagesx($im);$x++) {
			$rgb = ImageColorAt($im, $x, $y);
			$r = ($rgb >> 16) & 0xFF;
			$g = ($rgb >> 8) & 0xFF;
			$b = $rgb & 0xFF;
			$pix .= pack("C3",$b,$g,$r);
		}
	}
	$header = pack("Vv2VVVVvvVVVVVV",strlen($pix)+54,0,0,54,40,imagesx($im),imagesy($im),1,24,0,strlen($pix),0,0,0,0);
	if ($dir != "") {
		$inF = fopen($dir,"w");
		fwrite($inF,"BM".$header.$pix);
		fclose($inF);
	} else echo "BM".$header.$pix;
}

function infosbmp($dir) {
	$bmp = "";
	if (file_exists($dir)) {
		$file = fopen($dir,"r");
		while(!feof($file)) $bmp .= fgets($file,filesize($dir));
		if (substr($bmp,0,2) == "BM") return unpack("vtype/Vlength/v2reserved/Vbegin/Vsize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vncolor/Vimportant", $bmp);
		else return "Fichier bitmap non valide";
	} else return "Fichier non trouvé";
}

Conclusion :


Pour les bmp 256, 16 et 2 couleurs j'y travaille...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.