Convertir les Fichiers Bitmap en JPEG à l'aide de la librairie GD de PHP

J'ai essayé de trouver un moyen de convertir les fichiers bitmap en JPEG à l'aide de la librairie GD de PHP.

J'ai essayé de nombreuses implémentations, mais rien ne semble fonctionner. J'ai essayé de dire à mon client qu'il ne doit pas utiliser les fichiers Bitmap, mais il insiste et franchement ne pas comprendre assez sur les ordinateurs pour les convertir en JPG sur son propre.

Je ne peux pas utiliser ImageMagick sur ce serveur et j'ai besoin d'un pur GD solution. Merci d'avance pour toute aide.

EDIT:

Les images bitmap sont utilisés sont de 16 bits et c'est là que le problème se produit.

J'ai cette fonction que j'ai de travail .... 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: est-ce

Convertir les Fichiers Bitmap en JPEG à l'aide de la librairie GD de PHP

Si vous regardez l'image sur le côté gauche, vous pouvez voir que l'image qui en résulte n'est pas aligné correctement. La petite mèche appartient sur le côté droit. Où est le code qui va pas? Le problème se produit dans les 16 bits d'autre-si.

Merci encore pour toute l'aide que.

Eu un coup d'oeil à ton code semble correct. Êtes-vous sûr que le format BMP est comme prévu (54 octets, pas de palette de données, les données de l'image suivante)? Comme c'est exotique BMP variante, il y a peut-être plus/moins de données dans l'en-tête qui conduit à ce "décalage" erreur.
Je dois être honnête, je ne suis pas vraiment sûr de ce qui se passe sur l'image. Si il y avait un moyen d'e-mail de l'une des photos de vous ainsi, vous pouvez vérifier... je m'intéresse plus que jamais dans ce qui se passe avec ces fichiers d'image. Un courriel que j'ai peut être contacté à est dphoebus à g mail dot com et je vais répondre à l'une des images.

OriginalL'auteur Daniel P | 2009-10-18