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
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.
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
Vous devez vous connecter pour publier un commentaire.
Utiliser cette fonction:
http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm
Il supporte plusieurs bitrate comme 16 et 32 bits. De Plus il contient quelques corrections de bugs concernant l'absence de taille, négatif palettes de couleurs, la sortie d'erreur, 16-masque de bits de l'en-tête (ce qui est le principal problème sur 16 bits) et la réduction de la palette de couleurs (biClrUsed).
Espérons qu'il vous plaira 😉
Mise à jour en 2015: Cette fonction est maintenant une partie de DOMPDF et a été porté à la perfection. Maintenant, il couvre comprimé 4 - et 8-bits, ignore sans importance-têtes et prend en charge le spécial de 16 bits 565 masque.
OriginalL'auteur mgutt
Alors que GD ne prend pas en charge BMP en natif, un peu gros de googler fournit un quelques userland implémentations d'un imagecreatefrombmp() fonction.
Je n'ai pas essayé, mais je suis convaincu qu'au moins l'un d'entre eux va travailler pour vous.
OriginalL'auteur timdev
Comment au sujet de la imagejpeg fonction?
Pour les aider à l'appui de format BMP dans GD, avoir un regard ici, par exemple.
EDIT: Cela ne prend pas en charge 16 bits des images qui est juste comme l'image d'origine spécification ne le supporte pas. Dans votre cas, veuillez trouver quel modèle de bits est utilisé pour coder la valeur de la couleur. Je suppose que c'est 5 bits pour le R et B, 6 bits pour G et la commande est BGR dans cette solution (merci d'insérer dans le code que j'ai lié ci-dessus):
Noter que je n'ai pas testé ce code (en particulier, je ne suis pas sûr que la mise à l'échelle 0..255) et il ne fonctionne que si 5-6-5 modèle binaire a été utilisé (bien, il va travailler avec les autres, aussi, mais les couleurs ne seront pas).
Je vous remercie encore. J'ai essayé cette solution. Le fichier qui en résulte a été renvoyée a été solide, image en noir avec des lignes vertes horizontales espacées de manière égale en dehors de l'ensemble de la longueur de l'image.
OriginalL'auteur schnaader
Sur le dessus de ma tête:
Qui acceptent n'importe quel format GD peut gérer en tant qu'entrée et de sortie d'un fichier jpeg. Je ne sais pas de quelle version de GD vous les gens, mais mine de poignées .bmp parfaitement et n'ont donc la version que nous avons utilisé lors de la précédente entreprise, j'ai travaillé pour. (sur Mac OS X 10.6 et CentOS 5, respectivement)
modifier: oublié imagedestroy! ouch!
Je vous remercie pour votre aide. J'ai donné un essai et eu cette erreur: imagecreatefromstring() [function.imagecreatefromstring]: les Données ne sont pas dans un format reconnu. Ceci est probablement dû à la reprise de 16 bits bitmaps que mon client est à l'aide.
Je ne pense pas que j'ai jamais couru dans un 16bit image, mais il semble bien fonctionner pour 24bits, et même RLE des images codées.
OriginalL'auteur Kris