J'ai essayé de trouver un moyen de convertir des fichiers bitmap en JPEG en utilisant la bibliothèque GD en PHP.Convertir des fichiers bitmap en JPEG en utilisant la bibliothèque GD en PHP
J'ai essayé de nombreuses implémentations mais rien ne semble fonctionner. J'ai essayé de dire à mon client qu'il ne devrait pas utiliser les fichiers Bitmap mais il insiste et ne comprend pas assez les ordinateurs pour les convertir en JPG.
Je ne peux pas utiliser ImageMagick sur ce serveur et j'ai besoin d'une solution GD pure. Merci d'avance pour toute aide.
EDIT:
Les images bitmap qui sont utilisés sont de 16 bits et qui est l'endroit où le problème se produit.
J'ai cette fonction que je travaille .... un peu:
function ImageCreateFromBMP($filename) {
if (! $f1 = fopen($filename,"rb")) return FALSE;
$FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
if ($FILE['file_type'] != 19778) return FALSE;
$BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
'/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
'/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
$BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
$BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
$BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
$BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
$BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
$BMP['decal'] = 4-(4*$BMP['decal']);
if ($BMP['decal'] == 4) $BMP['decal'] = 0;
$PALETTE = array();
if ($BMP['colors'] < 16777216 && $BMP['colors'] != 65536) {
$PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
}
$IMG = fread($f1,$BMP['size_bitmap']);
$VIDE = chr(0);
$res = imagecreatetruecolor($BMP['width'],$BMP['height']);
$P = 0;
$Y = $BMP['height']-1;
while ($Y >= 0) {
$X=0;
while ($X < $BMP['width']) {
if ($BMP['bits_per_pixel'] == 24)
$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
elseif ($BMP['bits_per_pixel'] == 16) {
$COLOR = unpack("v",substr($IMG,$P,2));
$blue = ($COLOR[1] & 0x001f) << 3;
$green = ($COLOR[1] & 0x07e0) >> 3;
$red = ($COLOR[1] & 0xf800) >> 8;
$COLOR[1] = $red * 65536 + $green * 256 + $blue;
}
elseif ($BMP['bits_per_pixel'] == 8) {
$COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif ($BMP['bits_per_pixel'] == 4) {
$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
elseif ($BMP['bits_per_pixel'] == 1) {
$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
if (($P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7;
elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
$COLOR[1] = $PALETTE[$COLOR[1]+1];
}
else
return FALSE;
imagesetpixel($res,$X,$Y,$COLOR[1]);
$X++;
$P += $BMP['bytes_per_pixel'];
}
$Y--;
$P+=$BMP['decal'];
}
fclose($f1);
return $res;
}
L'image résultante est la suivante:
Si vous regardez l'image sur la main gauche côté, vous pouvez voir que l'image résultante n'est pas correctement alignée. Le petit ruban appartient sur le côté droit. Où est le code qui va mal? Le problème se produit dans le 16-bit else-if.
Merci encore pour toute l'aide.
J'ai regardé votre code, semble correct. Êtes-vous sûr que le format BMP est comme prévu (54 octets, pas de données de palette, suivi de données d'image)? Comme il s'agit d'une variante BMP exotique, il se peut qu'il y ait des données supplémentaires/inférieures dans l'en-tête qui conduisent à cette erreur de "décalage". – schnaader
Je dois être honnête, je ne suis pas vraiment sûr de ce qui se passe avec l'image. S'il y avait un moyen de vous envoyer une des images par e-mail pour que vous puissiez y jeter un coup d'œil ... Je m'intéresse plus que jamais à ce qui se passe avec ces fichiers image. Un email que je peux être contacté est dphoebus à g mail dot com et je vais répondre avec l'une des images. –