[ erweiterte Suche ]

»function imagecreatefrombmp(): Läuft mit allen Bitraten!

Ausgabe meiner IP-Cam gezielt per PHP aufnehmen?Neues Thema eröffnenNeue Antwort erstellenDas Thema einem Freund empfehlenDas Thema druckenimagebmp(): gute Funktion gefunden!
Seite 1 von 2 [12 Beiträge]
Seite: 1, 2 Weiter
AutorNachricht
Administrator 


Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 40795
Chats: 11134
Wohnort: Hennef


Meine eBay-Auktionen:
16.04.2010, 10:09


Es hat mich 4 Tage Arbeit gekostet, aber ich konnte die Funktion nun wie gewünscht fertigstellen.

Sie unterstützt nun alle gängigen 1-, 4-, 8-, 16-, 24- und 32-Bit Bitmaps.

Sie basiert auf der Funktion von DHKold, der diese bei php.net veröffentlicht hatte.

Die fertige Funktion:

   Code:
if (!function_exists('imagecreatefrombmp')) { function imagecreatefrombmp($filename) {
// version 1.00
if (!($fh = fopen($filename, 'rb'))) {
trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING);
return false;
}
// read file header
$meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14));
// check for bitmap
if ($meta['type'] != 19778) {
trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING);
return false;
}
// read image header
$meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40));
// read additional 16bit header
if ($meta['bits'] == 16) {
$meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12));
}
// set bytes and padding
$meta['bytes'] = $meta['bits'] / 8;
$meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4)- floor($meta['width'] * $meta['bytes'] / 4)));
if ($meta['decal'] == 4) {
$meta['decal'] = 0;
}
// obtain imagesize
if ($meta['imagesize'] < 1) {
$meta['imagesize'] = $meta['filesize'] - $meta['offset'];
// in rare cases filesize is equal to offset so we need to read physical size
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;
}
}
}
// calculate colors
$meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors'];
// read color palette
$palette = array();
if ($meta['bits'] < 16) {
$palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4));
// in rare cases the color value is signed
if ($palette[1] < 0) {
foreach ($palette as $i => $color) {
$palette[$i] = $color + 16777216;
}
}
}
// create gd image
$im = imagecreatetruecolor($meta['width'], $meta['height']);
$data = fread($fh, $meta['imagesize']);
$p = 0;
$vide = chr(0);
$y = $meta['height'] - 1;
$error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!';
// loop through the image data beginning with the lower left corner
while ($y >= 0) {
$x = 0;
while ($x < $meta['width']) {
switch ($meta['bits']) {
case 32:
case 24:
if (!($part = substr($data, $p, 3))) {
trigger_error($error, E_USER_WARNING);
return $im;
}
$color = unpack('V', $part . $vide);
break;
case 16:
if (!($part = substr($data, $p, 2))) {
trigger_error($error, E_USER_WARNING);
return $im;
}
$color = unpack('v', $part);
$color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3);
break;
case 8:
$color = unpack('n', $vide . substr($data, $p, 1));
$color[1] = $palette[ $color[1] + 1 ];
break;
case 4:
$color = unpack('n', $vide . substr($data, floor($p), 1));
$color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F;
$color[1] = $palette[ $color[1] + 1 ];
break;
case 1:
$color = unpack('n', $vide . substr($data, floor($p), 1));
switch (($p * 8) % 8) {
case 0:
$color[1] = $color[1] >> 7;
break;
case 1:
$color[1] = ($color[1] & 0x40) >> 6;
break;
case 2:
$color[1] = ($color[1] & 0x20) >> 5;
break;
case 3:
$color[1] = ($color[1] & 0x10) >> 4;
break;
case 4:
$color[1] = ($color[1] & 0x8) >> 3;
break;
case 5:
$color[1] = ($color[1] & 0x4) >> 2;
break;
case 6:
$color[1] = ($color[1] & 0x2) >> 1;
break;
case 7:
$color[1] = ($color[1] & 0x1);
break;
}
$color[1] = $palette[ $color[1] + 1 ];
break;
default:
trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING);
return false;
}
imagesetpixel($im, $x, $y, $color[1]);
$x++;
$p += $meta['bytes'];
}
$y--;
$p += $meta['decal'];
}
fclose($fh);
return $im;
}}



Ich werde Sie bei Bedarf erweitern, aber so wie sie jetzt ist, hat sie bisher alle durch unsere User hochgeladenen Bilder erfolgreich abgedeckt.

Wie es anfing:
   Zitat:
Ich habe ca. 1.000 durch Nutzer unserer Community hochgeladene Bitmaps zum Test herangezogen.

Diese Funktion geht nicht:
http://printf.ru/wiki/imagecreatefrombmp

Diese auch nicht:
http://snipplr.com/view/24283/imagecreatefrombmp/

Sinnfrei, weil die includete "function_imagecreatefrombmp.php" fehlt:
http://www.php-code.eu/code/Function-ImageCreateFromBMP-169.html

Weitere Tests laufen..

Zuletzt bearbeitet von mgutt am 20.04.2010, 08:33, insgesamt 5-mal bearbeitet

Verfasst am: 16.04.2010, 14:34

Funktioniert nicht (werden falsch ausgelesen und dazu läuft der RAM voll):
http://www.php.net/manual/de/function.imagecreatefromwbmp.php#83119

Verfasst am: 16.04.2010, 14:50

Nicht kompatibel zu 8 und 16 Bit Bitmaps:
http://www.php.net/manual/de/function.imagecreatefromwbmp.php#86214

Verfasst am: 16.04.2010, 14:55

Getestet mit den Bugfixes in späteren Kommentaren:
http://www.php.net/manual/de/function.imagecreate.php#53879

Resultat:
Noch nicht ganz perfekt.

Ich habe das noch etwas korrigiert, da die Bugfixes nicht korrekt waren und zu Farbfehlern bei 16 Bit Bitmaps führten.

Weiterhin habe ich den Code optimiert und eine Bedingung für 16 Bit Bilder realisiert, die auch eine Palette besitzen.

Aktuell hänge ich bei einigen wenigen Bildern fest, die nicht korrekt umgerechnet werden. Laut Header haben die ebenfalls 16 Bit, aber nach ca. 50% bricht die Umrechnung ab. Keine Ahnung warum.

Die Funktion unterstützt auch kein 32 Bit. Daher suche ich erstmal weiter.

Verfasst am: 16.04.2010, 15:04

Soll bei 32 Bit gehen, funktionierte bei mir aber nur mit 8 Bit:
http://bytes.com/topic/php/answers/6631-bmp-gd-then-jpg-32-bits

Verfasst am: 16.04.2010, 15:12

Die Funktion hat fast genau den gleichen Fehler wie die von mir zuvor korrigierte von php.net:
http://bytes.com/topic/php/answers/4399-imagecreatefrombmp (Den Link hatte ich hier gefunden)

Bei bestimmten 16 Bit Bildern gibts Probleme. Allerdings bei ein paar mehr als zuvor.

Es resultiert diese Fehlermeldung:
   Zitat:
Warning: imagecreatefromgd() [function.imagecreatefromgd]: '/tmp/GDZs5PSQ' is not a valid GD file in /www/htdocs/xyz on line 123


Ich vermute mal fast, dass die in der Version komplett ignoriert werden und daher der Fehler auftaucht. Ich mach mir mal die Mühe und formatiere den Code. Mal sehen ob ich was finde.

Zuletzt bearbeitet von mgutt am 20.04.2010, 08:25, insgesamt einmal bearbeitet

Verfasst am: 16.04.2010, 15:39

Ok die Funktion kann allgemein nicht mit 16 Bit Bildern umgehen. Mal sehen ob ich sie erweitern kann.
Verfasst am: 16.04.2010, 15:52

Noch habe ich nichts herausfinden können. Aber dafür habe ich schon mal die 32-Bit Bedingung von hier eingebaut.

Ich muss gleich mal schauen, ob ich überhaupt 32 Bit Bitmaps zum Testen da habe.

Aber bis dahin erstmal weiter mit 16 Bit. Hier hatte schon jemand erfolglos danach gefragt.

Verfasst am: 16.04.2010, 16:00

An die 16 Bit Lösung hat sich hier schon mal jemand rangetraut:
http://stackoverflow.com/questions/1586094/convert-bitmap-files-into-jpeg-using-the-gd-library-in-php/1586107#1586107

Aber die Variante habe ich getestet und ich erhalte wie in dem Kommentar geschildert ebenfalls ein grünes Bild als Resultat.

Verfasst am: 16.04.2010, 16:07

Ich bin bei der Suche hier drüber gestolpert:
http://www.phpsources.org/scripts120-PHP.htm

Funktioniert aber mit gar keiner Bitrate bzw. alle Bilder werden diagonal und schwarz / weiß ausgegeben ;)
Nach obenprofil pn email
Gast 

19.04.2010, 23:29


Mach mit!

Wenn Dir die Beiträge gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:

    » Anmelden

Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...
Nach oben
Seite 1 von 2 [12 Beiträge]
Seite: 1, 2 Weiter
Neues Thema eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:HitsLetzter Beitrag
suche d16z6 mit allen anbauteilen
hey leute bin auf der suiche nach einen d16z6 mit allen anbauteilen einfach alles anbieten...
von ichundmeinhonda
35008.03.2012, 09:08
major-iacis
Burnout mit meine Prelude sollte bei allen gehen
Ich habe mal meine alten Sommerreifen verheitzt, komischer weisse läuft das Auto nach dem Burnout besser. Ich empfehle euch das nicht nach zumachen denn nach einer Woche stinkt es immernoch nach Gummi im Innenraum. Einmal sieht man im video dass der...
Seite 2von 36Chamber
14142223.02.2006, 21:51
Metalass
mkfile function
Hi, diese Funktion erstellt bei Bedarf eine Datei. function mkfile($filename, $data='', $chmod=0644) { if ($data) { // serialize array if (is_array($data)) { $h =...
[PHP]von mgutt
057620.09.2009, 13:25
mgutt
The Pursuit of Function
He Leute ich denke dieses Material gehört mit zu den besten Docu´s die erzählen was JDM eigentlich ist! Ich kann nur sagen es lohnt sich es zu besorgen, nachdem man diese Docu geguckt hat versteht man JDM und den Lebenstil JDM. Ich kann nur sagen ...
von Smooth587
222321.01.2008, 22:29
Smooth587
Biete neuen D16y8 turbomotor mit allen teilen und extras
hey ich biete euch hier meinen d16y8 aus nem ej8 verkauf das wegen projektaufgabe und zeitlichen gründen der Motorblock wurde komplett erneuert mit neuem p2p kolben abstreif und kolbenringe eagle pleule mit neuen lagerschalen. es wurden alle dichtung...
Seite 2von hompi eg
1670202.04.2012, 08:01
hompi eg
Warning: mysql_connect() [function.mysql-connect]: Can't con
Ich brauche dringend hilfe. auf [URL=http://imp-rom.wdpt.de/]http://imp-rom.wdpt.de[/URL] kann ich nicht weiterarbeiten, weil die MySQL-Verbindung nicht klappt. Ich hab alles versucht, aber die Daten stimmen und ich weiß nicht, was ich jetzt noch tun...
[Allgemein]von mox9.imp-rom
3160103.09.2009, 12:19
mox9.imp-rom
wünsche allen
wünsche allen MaXReVer´n heut abend viel...
Seite 2, 3von Kolbenring
25103002.11.2006, 18:49
eRX
FROHE OSTERN euch allen
Das Wetter spielt nicht richtig mit, der Frühling lässt uns warten. Der Hase, der ist trotzdem fit, das Osterfest kann starten. Frohes Osterfest...
von VtecMac
667720.03.2008, 21:33
M-Tec-R
Unterschied zwischen allen Motoren ??
Hey,worin liegt der unterschied zwischen den b,-d,-k,-h.-etc. motoren,und dem y7,y8,z6 und was da alles giebt,und was bedeutet dies alles... Bitte helft mir-bin sehr an honda interessiert Danke im vor hinein Mfg...
von EJ6_JUNKEY_
517629.11.2010, 22:16
Der_Ronny
US Blinker glimmen an allen Blinkern
Hi, hab grad die us style blinker module drinne... die frontblinker glimmen mit abblendlicht.. einmal habe ich es hinbekommen gehabt das die komplette blinkanlage geglimmt hat.. wie ich dies gemacht habe weiss ich nicht mehr.. kann mir da einer...
von semih37
215931.01.2011, 12:03
RGT
© 2004 - 2012 www.programmierer-forum.de (srv02) | Communities | Impressum