| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Bewertung: |
| | ||
| Benutzer Registriert seit: 17.06.2009
Beiträge: 97
PHP-Kenntnisse: Fortgeschritten ![]() | Hier die fertige Funktion: function imagecreatefrombmp(): Läuft mit allen Bitraten! - Forum: PHP Wie alles begann: Zitat:
__________________ meine PHP Scripte Geändert von hondatuner (20.04.2010 um 11:20 Uhr). | |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Benutzer Registriert seit: 17.06.2009
Beiträge: 97
PHP-Kenntnisse: Fortgeschritten ![]() | Nun der Code ist nicht von mir und die Bit-Extraktion verstehe ich zu wenig, um sie kommentieren zu können. Was willst Du denn wissen? EDIT: Upps, ich sehe gerade, dass ich beim Editieren einen Teil meines Beitrags überschrieben habe. Mist. Ich versuche es mal wiederherzustellen. Also im ersten Schritt wird bei jedem Bild geprüft ob in den Meta-Daten eine Palette vorhanden ist: PHP-Code: Im Falle von 16 Bit greift dann dieser Part: PHP-Code: EDIT2: Ok so viel habe ich schon mal: 16 Bit hat doch keine Palette. Es gab nur zufälligerweise Bilder, in denen die ausgelesenen Bytes als Palette erkannt wurden. Allerdings hat 16 Bit einen größeren Header. Den versuche ich jetzt gerade zu extrahieren und herauszufinden, was da drin steht. Später mehr dazu...
__________________ meine PHP Scripte Geändert von hondatuner (17.04.2010 um 00:13 Uhr). |
| | |
| | ||
| Benutzer Registriert seit: 17.06.2009
Beiträge: 97
PHP-Kenntnisse: Fortgeschritten ![]() | Jo, hatte ich in meinem EDIT schon erkannt. Bei 16-Bit griff das Auslesen der Palette eigentlich nur zufällig und ich dachte deswegen, dass es eine geben müsse. Tat es aber nicht. Stattdessen hatte ich eigentlich nur das Problem, dass bei 16-Bit 5:6:5 maskierten Bitmaps ein zusätzlicher Header (rMask, gMask & bMask) ausgelesen werden muss bzw. dieser hätte übersprungen werden müssen, um an das erste Byte des Bilder zu kommen. Erst wusste ich nichts mit den Mask-Werten anzufangen, bin dann aber hier und hier schnell fündig geworden. Damit steht nun die Version, die auch mit 16-Bit Bitmaps umgehen kann: PHP-Code: EDIT: Dieses eine 8-Bit Bitmap macht komischerweise Probleme: http://www.maxrev.de/files/2006/10/amijdm_140.bmp extrahierte Daten: Zitat:
EDIT2: Ok, hab noch ein paar andere gefunden, die nicht gehen. Auch ein 32-Bit Bitmap dabei mit dem ich dann testen kann. Ich mache aber erst morgen weiter. Halte Euch auf dem Laufenden...
__________________ meine PHP Scripte Geändert von hondatuner (17.04.2010 um 01:36 Uhr). | |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 24.05.2008
Beiträge: 173
PHP-Kenntnisse: Anfänger ![]() ![]() | Seit wann gibt es Bitmaps mit 16 Bit Farbtiefe UND Palette? Soweit ich weiß können Farbpaletten nur bei den Farbtiefen 1-, 4- und 8-Bit benutzt werden. 16-Bit benutzt eine Bitmaske, in denen die drei Farbkanäle über 2 Byte verteilt werden; aber niemals eine Farbpalette. Bei 24- und 32-Bit wird jeder Farbkanal einzeln in einem Byte gespeichert; auch keine Farbpalette. |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() | 24 Bit und 32 Bit sind im Grunde identisch, der Alphakanal wird bei BMP's nicht genutzt. PHP-Code: edit: 8 Bit Palette muss nicht zwangsläufig komplett gefüllt sein. 'biClrUsed' bzw 'biClrImportant' sollte darüber Aufschluss geben. 'biClrUsed' ist 32 bei deinem Beispiel.
__________________ Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot. Geändert von lstegelitz (17.04.2010 um 10:56 Uhr). |
| | |
| | |||||
| Benutzer Registriert seit: 17.06.2009
Beiträge: 97
PHP-Kenntnisse: Fortgeschritten ![]() | Zum dritten Mal: War eine falsche Schlussfolgerung meinerseits :P Zitat:
Zitat:
Zitat:
EDIT: Also 32-Bit ist genauso wie 24-Bit. Der Alphakanal störte wohl bei der Berechnung der Farbe. Lässt man ihn hingegen weg stimmt alles: Code: case 32:
case 24:
$color = unpack('V', substr($data, $p, 3) . $vide);
break;
Zitat:
EDIT2: Ein paar 24-Bit Bitmaps haben im Header eine filesize gleich offset und die imagesize ist leer. Daher ein Bugfix mit filesize(): Code: // obtain imagesize
if ($meta['imagesize'] < 1) {
$meta['imagesize'] = $meta['filesize'] - $meta['offset'];
if ($meta['imagesize'] < 1) {
$meta['imagesize'] = @filesize($filename) - $meta['offset'];
if ($meta['imagesize'] < 1) {
trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING);
return false;
}
}
}
Also bei 8-Bit und begrenzter Palette komme ich aktuell nicht weiter. Ich habe die Anzahl der Farben reduziert, sobald biClrUsed gesetzt ist: Code: // calculate colors $meta['colors'] = $meta['ncolor'] ? $meta['ncolor'] : pow(2, $meta['bits']); Code: // read palette
$palette = array();
if ($meta['colors'] < 16777216 && $meta['bits'] != 16) {
$palette = unpack('V' . $meta['colors'], fread($fh, $meta['colors'] * 4));
}
Code: case 8:
$color = unpack('n', $vide . substr($data, $p, 1));
echo $color[1] . ':';
$color[1] = $palette[ $color[1] + 1 ];
echo $color[1] . ', ';
break;
Code: 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 2:4278255873, 2:4278255873, 2:4278255873, 2:4278255873, 2:4278255873, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 2:4278255873, 6:4290209603, 17:4288105267, 17:4288105267, 2:4278255873, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 8:4279636996, 20:4282794244, 20:4282794244, 20:4282794244, 20:4282794244, 8:4279636996, 26:0, 26:0, 26:0, 26:0, 26:0, 2:4278255873, 2:4278255873, 2:4278255873, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 2:4278255873, 18:4292051795, 6:4290209603, 17:4288105267, 2:4278255873, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 2:4278255873, 14:4284635918, 9:4291540229, 16:4290160387, 16:4290160387, 16:4290160387, 24:4289305347, 24:4289305347, 14:4284635918, 2:4278255873, 26:0, 26:0, 2:4278255873, 23:4292987432, 9:4291540229, 9:4291540229, 2:4278255873, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 26:0, 2:4278255873, 6:4290209603, 6:4290209603, 19:4289156923, 2:4278255873 EDIT4: Die Palette sieht irgendwie falsch aus, wenn ich davon ausgehe, dass 16.777.215 den höchsten Wert darstellt: Code: Array
(
[1] => 4294967294
[2] => 4292598747
[3] => 4278255873
[4] => 4278190080
[5] => 4293651435
[6] => 4294967295
[7] => 4290209603
[8] => 4294963219
[9] => 4279636996
[10] => 4291540229
[11] => 4294963014
[12] => 4294632965
[13] => 4294896179
[14] => 4293580548
[15] => 4284635918
[16] => 4292199171
[17] => 4290160387
[18] => 4288105267
[19] => 4292051795
[20] => 4289156923
[21] => 4282794244
[22] => 4287727121
[23] => 4292988421
[24] => 4292987432
[25] => 4289305347
[26] => 4292199703
[27] => 0
[28] => 4278190080
[29] => 4278190080
[30] => 4278190080
[31] => 4278190080
[32] => 4278190080
)
Ich denke mal hier liegt der Hund begraben: Code: [xres] => 3780
[yres] => 3780
Oder gibt es wieder gar keine Palette ^^ EDIT6: Bei einem 1-Bit Bild genau das gleiche Problem: Code: Array
(
[type] => 19778
[filesize] => 270254
[reserved] => 0
[offset] => 62
[headersize] => 40
[width] => 1238
[height] => 1732
[planes] => 1
[bits] => 1
[compression] => 0
[imagesize] => 270192
[xres] => 5905
[yres] => 5905
[ncolor] => 2
[important] => 2
[colors] => 2
[bytes] => 0.125
[decal] => 1.25
)
__________________ meine PHP Scripte Geändert von hondatuner (17.04.2010 um 16:16 Uhr). | ||||
| | |
| | ||||
| Erfahrener Benutzer Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() | Zitat:
3780 / 100 * 2.54 = ~96 5905 / 100 * 2.54 = ~150 (Ein inch sind ungefähr 2.54 cm) Ich glaube eher, dein Hund liegt hier begraben: Zitat:
"byte" ist 1 für 1,2,4,8 Bit Farbtiefe "byte" ist 2 für 16 Bit Farbtiefe "byte" ist 3 für 24 Bit Farbtiefe "byte" ist 4 für 32 Bit Farbtiefe "decal" ist 4 - ((width * "byte") % 4) Die Datei sieht auch etwas seltsam aus: Zitat:
padding: 2 byte (width % 4) 1240 * 1732 * 1 / 8 ( (width + padding) * height * bits / 8 ) = 268460 Da ensteht genau eine Spalte Differenz: 270192 - 268460 = 1732 Wie groß ist die Datei denn wirklich (physisch)? Bzw. was sagt ein anderes Bildbearbeitungsprogramm bezüglich Größe?
__________________ Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot. | |||
| | |
| | ||||
| Benutzer Registriert seit: 17.06.2009
Beiträge: 97
PHP-Kenntnisse: Fortgeschritten ![]() | Zitat:
PHP-Code: Scheinbar muss es manchmal "leere" Rückgaben geben. Leer schein mir dann die Standardfarbe aus der Palette zu sein, die sich durch unpack('n', chr(0)) ergibt. Das gilt übrigens für 8, 4 und 1 Bit. Ich hatte nämlich erst versucht einen Error zu triggern, wenn $part leer ist: PHP-Code: Zitat:
1238x1732 Pixel, 270.254 Bytes, 150x150 Punkte pro Zoll Hier der Link zu dem besagten Bild: http://www.maxrev.de/files/2006/10/p...and_bild_1.bmp Ein anderes 1-Bit Bild mit diesen Angaben geht übrigens problemlos: PHP-Code: EDIT: Diese Formel habe ich gefunden (von hier: http://en.wikipedia.org/wiki/Windows...#Pixel_storage ): Zitat:
PHP-Code:
__________________ meine PHP Scripte Geändert von hondatuner (19.04.2010 um 14:53 Uhr). | |||
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Transparenz bei Bitmaps | md5hash | Off-Topic Diskussionen | 1 | 25.06.2006 00:17 |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| imagecreatefrombmp, php imagecreatefrombmp, php bitmap, \php\ 4-bit image, imagecreatefrombmp 16 bit, 16 bit bmp, php create image bmp, 16 bit farbpalette, php bitmap erstellen, imagecreatefrombmp php, 16bit bmp erstellen, imagecreatefrombmp in php, 16-bit image, php bild 16 bit, bmp 16 bit, 16bit farbpaletten adobe, 16bit bitmap, php bmp erzeugen, 16 bit bmp erzeugen, php imagecreatefrombmp 16bit |