AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [PHP] transparente PNG-Bilder öffnen und DREHEN!
Thema durchsuchen
Ansicht
Themen-Optionen

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

Offene Frage von "alienous"
Ein Thema von alienous · begonnen am 8. Jul 2006 · letzter Beitrag vom 12. Jul 2006
Antwort Antwort
alienous

Registriert seit: 27. Jan 2006
94 Beiträge
 
#1

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

  Alt 8. Jul 2006, 18:10
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
habe ja immerhin schon das problem eingegrenzt, naja, verstehe nich so recht, wieso der befehl so viele probleme macht

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

danke
  Mit Zitat antworten Zitat
Dunedain
(Gast)

n/a Beiträge
 
#2

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

  Alt 8. Jul 2006, 23:56
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!
  Mit Zitat antworten Zitat
alienous

Registriert seit: 27. Jan 2006
94 Beiträge
 
#3

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

  Alt 9. Jul 2006, 00:29
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
  Mit Zitat antworten Zitat
Dunedain
(Gast)

n/a Beiträge
 
#4

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

  Alt 9. Jul 2006, 11:27
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...
  Mit Zitat antworten Zitat
alienous

Registriert seit: 27. Jan 2006
94 Beiträge
 
#5

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

  Alt 9. Jul 2006, 19:32
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
  Mit Zitat antworten Zitat
Dunedain
(Gast)

n/a Beiträge
 
#6

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

  Alt 10. Jul 2006, 21:47
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 ) 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... )
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...
  Mit Zitat antworten Zitat
alienous

Registriert seit: 27. Jan 2006
94 Beiträge
 
#7

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

  Alt 12. Jul 2006, 14:41
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
  Mit Zitat antworten Zitat
Dunedain
(Gast)

n/a Beiträge
 
#8

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

  Alt 12. Jul 2006, 14:48
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 ) nicht...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 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