Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] transparente PNG-Bilder öffnen und DREHEN! (https://www.delphipraxis.net/72883-%5Bphp%5D-transparente-png-bilder-oeffnen-und-drehen.html)

alienous 8. Jul 2006 17:10


[PHP] transparente PNG-Bilder öffnen und DREHEN!
 
hi,

binn auf ein sehr seltsames problem gestoßen!
zuerst einmal die versionen:

PHP Version 5.1.4
GD Version bundled (2.0.28 compatible)

jetz zum problem! sobald ich ein png öffne, dessen hintergrund transparent ist, und es rotiere, wird der hintergrund schwarz! ohne rotieren klappt anonsten alles, da bekomme ich auch ein weissen hintergund, so wie ich es auch möchte, sobald ich aber diese zeile hinzufüge:
Code:
$motiv = imagerotate($motiv, 90, 0);
erhalte ich ein bild mit schwarzen hintergrund. :(

habt ihr da tipps für mich? ich habe schon vieles probiert, aber es will einfach nicht klappen :wall:
habe ja immerhin schon das problem eingegrenzt, naja, verstehe nich so recht, wieso der befehl so viele probleme macht :gruebel:

für ansätze und lösungsvorschläge wäre ich seehr dankbar :)

danke

Dunedain 8. Jul 2006 22:56

Re: [PHP] transparente PNG-Bilder öffnen und DREHEN!
 
Hallo,

hab dein problem mal versucht, dein problem nachzubauen...

Jedoch konnte ich den beschriebenen "Fehler" beim drehen um 90 grad NICHT reproduzieren, aber beim drehen um kleinere oder größere Werte. die Lösung steckt im dritten und vierten Parameter der imagerotate Funktion (der vierte Parameter ist erst ab PHP 5.1.0 verfügbar), welche einen negativen Wert übergeben bekommen müssen, um eine bestehende Transparenz zu erhalten.

Code:
// Bilddatei laden...
$rImg = imagecreatefrompng('test.png');

// ...Bild drehen...
// ACHTUNG: Auf dritten und vierten Parameter achten!
$rImg = imagerotate($rImg, 25, -1, -1);

// Transparente Farbe setzten
// Workaround für den vierten imagerotate parameter
// imagecolorallocate bezeichnet dann die farbe, die im gedrehten bild transparent sein soll!
// ACHTUNG: Nur notwendig, wenn PHP version 'älter' als 5.1.0
#imagecolortransparent($rImg, imagecolorallocate($rImg, 255, 255, 255));

// ...und Bild ausgeben
header('Content-Type: image/png', true);
imagepng($rImg);
Falls der code nicht weiterhelfen sollte, kannst du ja mal eines deiner problem-bilder hochladen,
damit ich dein problem nachvollziehen kann!

alienous 8. Jul 2006 23:29

Re: [PHP] transparente PNG-Bilder öffnen und DREHEN!
 
hi,

danke für die antwort, leider habe ich mit den beiden parametern das problem immer noch :(

hier die url zu dem bild, hab über google das erst-beste genommen und momentan keine weitere getestet:

http://images.linux.com/babytux.png

danke

Dunedain 9. Jul 2006 10:27

Re: [PHP] transparente PNG-Bilder öffnen und DREHEN!
 
Konnte dein Problem jetzt (leider) nachvollziehen... Liegt aber schlicht und einfach an der Grafik selbst, da zumindest die Beispielgrafik ein 24-Bit PNG ist...
Konnte auch nur eine (in meinen Augen qualitativ unzureichende) Lösungsmöglichkeit finden, nämlich die neue Hintergrundfarbe (Schwarz) nach dem drehen als transparent zu definieren.

Code:
imagecolortransparent($rImg, imagecolorallocate($rOrginal, 0, 0, 0));
Bei dem Beispielbild kann man aber auch gut die Nachteile dieser Methode sehen, wie z.B. das Teile der Augen und des Mundes ebenfalls transparent werden (logisch, weil diese "Stellen" auch schwarz sind)

Sorry, aber ne bessere Möglichkeit wüsste ich momentan nicht...

alienous 9. Jul 2006 18:32

Re: [PHP] transparente PNG-Bilder öffnen und DREHEN!
 
ja thx, in der tat ist die lösung eher unzureichend bei meiner aufgabe... :( kann ich irgendwie rausfinden, ob das bild rotierbar ist oder nicht? dann könnte ich dem user ne meldung zurückgeben, das dieses format nicht unterstüzt wird :( (24bit bilder also abfangen?)

oder kann man vor dem rotieren irgendwie ne andere farbe als transparent angeben, (zb eine die nich im bild vorhanden ist, ROT?) dann rotieren, dabei wird der hintergrund rot, und nun kann man ihn wieder transparent machen. ginge das?

also entweder abfangen oder umgehn?

danke

Dunedain 10. Jul 2006 20:47

Re: [PHP] transparente PNG-Bilder öffnen und DREHEN!
 
Code:
$rImage = imagecreatefrompng('somefile.png');

if(imageistruecolor($rImage ))
{
    // Grafik mit mehr als 8 Bit Farbinformationen
    //  -> 16 / 24 / 32 Bit
}
else
{
    // 8 Bit Grafik
}
Damit kannst du herausfinden, ob es sich bei der Grafik um eine True Color Grafik handelt oder nicht. Jedoch solltest du nicht alle True Color Bilder verweigern, da JPEG beispielsweise fast immer im 16-Bit Format gespeichert werden und somit True Color Bilder sind!

Code:
GIF -> 8  Bit
JPEG -> 16 Bit
PNG -> VARIABEL: 8 Bit / 24 Bit / 32 Bit
Das mit dem Farben tauschen vor dem drehen ist zwar möglich, hätte aber vermutlich (habs nicht getestet :roll: ) keine Auswirkung auf das Ergebnis, da du ja dann die Farbe schwarz durch rot ersetzten würdest, wodurch die pixel in auge und mund, welche schwarz sind, auch rot gefärbt würden... Wenn du rot dann nach dem drehen als transparent definieren würdest, hättest du das gleiche Ergebnis als würdest du nach dem drehen schwarz als transparent definieren!

Für den Farbentausch kannst du folgenden Code verwenden...
(Ebenfalls nicht getestet... :oops: )
Code:
// Transparente Farbe des Bildes ermitteln
if( ($index = imagecolortransparent($rImage)) == -1)
{
    // Keine Transparente Farbe gesetzt!
    // -> Hintergrundfarbe verwenden (Pixel in der linken oberen Ecke)
    $index = imagecolorat($rImage, 1, 1);
}


// Farbe austauschen
// Die letzten drei Parameter dienen zur Definition der neuen Farbe (RGB)
if(!imagecolorset($rImage, $index, 255, 0, 0))
{
    die('Konnte Farben nicht tauschen');
}
Würde aber an deiner Stelle überlegen, ob du 24-Bit PNGs wirklich verweigern solltest, oder ob du sie einfach akzeptierst, sie aber nicht bearbeitest (drehst) und dem Benutzer in Roh-Form wieder zur Verfügung stellst...

Noch ne kleine Info am Rande, der Verlust der Transparenten Farbe beim drehen ist bekannt bugs.php.net, sollte aber offiziell nicht als Bug angesehen werden!



Hoffe, dass bringt dich der Lösung des Problems ein Stückchen näher...

alienous 12. Jul 2006 13:41

Re: [PHP] transparente PNG-Bilder öffnen und DREHEN!
 
hi,

nein das mit dem farbtausch meinte ich anders. angenommen wir haben ein 24bit bild, mit transparentem hintergrund und einem blauen kasten in der mitte. beim rotieren wäre ein blauer kasten auf schwarzem hintergrund die folge, wir setzen aber den transparenten hintergrund vor dem rotieren auf ROT, also blauer kasten auf rotem hintergrund, rotieren das dann, dann hätten wir beim rotieren keine transparenz mehr, und nach dem rotieren setzen wir das ROT wieder auf transparent.

ginge das?

danke
mfg

Dunedain 12. Jul 2006 13:48

Re: [PHP] transparente PNG-Bilder öffnen und DREHEN!
 
Müsste theortisch gehen...
Code:
// Transparenz löschen
imagecolortransparent($rImage, -1);

// Hintergrundfarbe herausfinden
$index = imagecolorat($rImage, 1, 1);

// Farbe austauschen
if(!imagecolorset($rImage, $index, 255, 0, 0))
{
    die('Konnte Farben nicht tauschen');
}
Aber wie schon gesagt, nur theoretisch, getestet hab ichs (wie üblich :roll:) nicht...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz