Ich habe versucht, eine Möglichkeit zum Konvertieren von Bitmap-Dateien in ein JPEG mit der GD-Bibliothek in PHP zu finden.Konvertieren von Bitmap-Dateien in JPEG mit der GD-Bibliothek in PHP
Ich habe zahlreiche Implementierungen versucht, aber nichts scheint zu funktionieren. Ich habe versucht, meinen Kunden zu sagen, dass sie keine Bitmap-Dateien verwenden sollten, aber er besteht darauf und versteht ehrlich gesagt nicht genug über Computer, um sie selbst zu JPG zu konvertieren.
Ich kann ImageMagick nicht auf diesem Server verwenden und ich brauche eine reine GD-Lösung. Vielen Dank im Voraus für jede Hilfe.
EDIT:
Die Bitmap-Bilder, die verwendet werden, sind 16-Bit und das ist, wo das Problem auftritt.
Ich habe diese Funktion, die ich gearbeitet haben .... irgendwie:
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;
}
Das resultierende Bild ist dies:
Wenn Sie auf das Bild auf der linken aussehen Seite können Sie sehen, dass das resultierende Bild nicht richtig ausgerichtet ist. Der kleine Splitter gehört auf der rechten Seite. Wo läuft der Code falsch? Das Problem tritt in dem 16-Bit-Else-If auf.
Vielen Dank noch einmal für die Hilfe.
Hatte einen Blick auf Ihren Code, scheint richtig. Sind Sie sicher, dass das BMP-Format wie erwartet ist (54 Bytes, keine Palettendaten, Bilddaten folgen)? Da es sich um eine exotische BMP-Variante handelt, können zusätzliche/weniger Daten im Header zu diesem "Shifting" -Fehler führen. – schnaader
Ich muss ehrlich sein, ich bin nicht wirklich sicher, was mit dem Bild los ist. Wenn es eine Möglichkeit gäbe, eines der Bilder per E-Mail an Sie zu senden, damit Sie es sich ansehen können ... Ich bin jetzt mehr denn je daran interessiert, was mit diesen Bilddateien passiert. Eine E-Mail, an die ich mich wenden kann, ist dphoebus bei g mail dot com und ich werde mit einem der Bilder antworten. –