php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 07.02.2011, 22:56  
Neuer Benutzer
 
Registriert seit: 07.02.2011
Beiträge: 2
PHP-Kenntnisse:
Fortgeschritten
Körnerbrötchen befindet sich auf einem aufstrebenden Ast
Standard Bildebenen vereinen mit Alphatransparenz

Hallo zusammen,
ich habe mich nun wieder einmal mit ein bisschen Bilderstellung in PHP beschäftigt, denn ich habe folgendes vor:
1. Ich möchte einen einfarbigen Hintergrund erstellen.
2. Darüber möchte ich ein PNG-Bild legen, welches transparente und halbtransparente Bereiche enthält.

Also habe ich mich ein wenig umgeschaut, die passenden Funktionen unter PHP gesucht und bin zu folgendem Ergebnis gekommen:
PHP-Code:
<?php
error_reporting
(E_ALL|E_STRICT);
ini_set('display_errors'1);

function 
imagecolorize ($img_orig$img_new$opacity$pfad$r=0$g=0$b=0) {
    
// Kopie des Originalbildes erstellen
    
$img imagecreatefrompng($pfad.$img_orig);

    
// Bildbreite und -höhe ermitteln
    
$img_width imagesx($img);
    
$img_height imagesy($img);

    
// Layer anlegen
    
$layer imagecreate($img_width$img_height);

    
// Alphatransparenz behalten
    
imagealphablending($imgtrue);
    
imagealphablending($layertrue);

    
// Farbe zuordnen
    
$color imagecolorallocate($layer$r$g$b);
    
    
// Layer mit der Farbe fuellen
    
$fill imagefill($layer00$color);

    
// Layer und Bildkopie "mergen"
    
$merge imagecopymerge($layer$img0000$img_width$img_height$opacity);

    
// Bild abspeichern
    
imagepng($img$pfad.$img_new);

    
// Layer vernichten
    
imagedestroy($layer);

    
// Originalbild vernichten
    
imagedestroy($img);
}

// Parameter
$img_orig "feld3.png"// Name Originalbild
$img_new "testneu.png"// Name neues (gefaerbtes) Bild
$opacity 50// Deckkraft (Wert zwischen 0 (transparent) und 100 (deckend)
$pfad "/var/www/sckunst/img/"// Physikalischer Pfad zum Bilderordner (mit $_SERVER['DOCUMENT_ROOT'] zu ermitteln, dann noch Verzeichnis dranhaengen)
$r 255// rot
$g 50// grün
$b 80// blau

imagecolorize($img_orig$img_new$opacity$pfad$r$g$b);
?>
Ist aber blöd, denn das darüber gelegte Bild ist nicht transparent, sondern wird durch die im PNG hinterlegte Ersatzfarbe ersetzt. Wo ist mein Fehler?

Viele Grüße
Körnerbrötchen
Körnerbrötchen ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.02.2011, 14:15  
Erfahrener Benutzer
 
Registriert seit: 17.01.2011
Beiträge: 171
PHP-Kenntnisse:
Anfänger
curryworld befindet sich auf einem aufstrebenden Ast
Standard

Hast du es mal mit imagecolortransparent() probiert?
curryworld ist offline   Mit Zitat antworten
Alt 08.02.2011, 15:20  
Neuer Benutzer
 
Registriert seit: 07.02.2011
Beiträge: 2
PHP-Kenntnisse:
Fortgeschritten
Körnerbrötchen befindet sich auf einem aufstrebenden Ast
Standard

Kann das gerade nicht ausprobieren, aber ich möchte ja auch keine Farbe transparent machen, sondern das darüber gelegte Bild (eine vorhandene Bilddatei) enthält ja schon Transparenz (eigentlich) und diese soll auch beim Darüberlegen auch erhalten bleiben.
Körnerbrötchen ist offline   Mit Zitat antworten
Alt 08.02.2011, 15:37  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

Zitat: sondern das darübergelegte Bild ist ja transparent


exakt - und diese Transparenz sorgt nun dafür, dass an diesen Stellen das dahinterliegende Bild (die Hintergrundebene, wenn du so willst) dargestellt wird Wo der Vordergrund nicht transparent ist, hat er ja seine eigene Bildinformation

Mithin macht der genau das, was beabsichtigt ist. Wenn da irgendwo noch Hintergrund durchscheinen soll, musst du das wie vorgeschlagen festlegen
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 08.02.2011, 16:58  
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse:
Fortgeschritten
erc wird schon bald berühmt werden
Standard

Mach mal aus den imagecreate ein imagecreatetruecolor, dann sollte es auch mit dem Alphakanal beim kopieren klappen.
erc ist offline   Mit Zitat antworten
Alt 08.02.2011, 17:08  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Also ich habe das damals nie ordentlich hinbekommen. Da war allerdings auch noch eine Dreh-Operation am Start. Die Folge waren faserige Ränder in der Transparenzfarbe.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 08.02.2011, 23:57  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Körnerbrötchen Beitrag anzeigen
Hallo zusammen,
ich habe mich nun wieder einmal mit ein bisschen Bilderstellung in PHP beschäftigt, denn ich habe folgendes vor:
1. Ich möchte einen einfarbigen Hintergrund erstellen.
2. Darüber möchte ich ein PNG-Bild legen, welches transparente und halbtransparente Bereiche enthält.

Also habe ich mich ein wenig umgeschaut, die passenden Funktionen unter PHP gesucht und bin zu folgendem Ergebnis gekommen:
PHP-Code:
<?php
// ...
    // Alphatransparenz behalten
    
imagealphablending($imgtrue);
    
imagealphablending($layertrue);
// ...
?>
Ist aber blöd, denn das darüber gelegte Bild ist nicht transparent, sondern wird durch die im PNG hinterlegte Ersatzfarbe ersetzt. Wo ist mein Fehler?
Ich hatte mit einem ähnlichen Problem zu kämpfen, imageAlphaBlending() in Verbindung mit imageSetPixel(). Der Parameter Blend-Mode wird meist intuitiv falsch herum benutzt, weil der deutschsprachige Leser "...Alpha..." liest und denkt, damit schaltet man Alpha-Transparenz ein. "To blend" bedeutet aber "mischen" und genau das macht imageAlphaBlending() wenn man $blendmode auf TRUE setzt: Die Farbanteile der beiden Pixel werden gemischt, ohne den Alphakanal zu beachten.

Deswegen hab ich mir an passender Stelle folgendes in den Quelltext geschrieben, um meinem lückenhaften Erinnerungsvermögen für die Zukunft auf die Sprünge zu helfen:

Code:
// setting this to TRUE does not work as intended
// the purpose of this functions seems to be counter-intuitive, but ...
// the second argument is named BLEND MODE
// this means:
// FALSE: imageSetPixel() writes the given colour including its alpha-channel
// TRUE: imageSetPixel() blends the given colour with the current one
imageAlphaBlending($img, FALSE);
Also versuchs mal damit, den Blend-Mode auf FALSE zu setzen, dann sollte die Transparenz beachtet werden.

Zitat:
Zitat von nikosch Beitrag anzeigen
Also ich habe das damals nie ordentlich hinbekommen. Da war allerdings auch noch eine Dreh-Operation am Start. Die Folge waren faserige Ränder in der Transparenzfarbe.
Eine alternative Vorgehensweise in diesem Fall wäre, das Hintergrundbild in die entgegengesetzte Richtung zu drehen, das "Stempel"-Bild mit Alphatransparenz hineinzukopieren und anschließend das Ergebnis wieder zurückzudrehen.

Geändert von fireweasel (12.02.2011 um 10:38 Uhr).
fireweasel ist offline   Mit Zitat antworten
Alt 09.02.2011, 14:02  
Benutzer
 
Benutzerbild von daemonTutorials
 
Registriert seit: 08.02.2011
Beiträge: 37
PHP-Kenntnisse:
Fortgeschritten
daemonTutorials zeigte ein beschämendes Verhalten in der Vergangenheit
daemonTutorials eine Nachricht über Skype™ schicken
Standard

Ist noch niemand darauf hingewiesen worden, das ini_set() und error_reporting() als (sry) "dumm" gelten?

ini_set() verändert die php.ini nur für das bestehende Skript. Du solltest eigentlich immer daran denken: Fehler sind gut zur Fehlersuche!

Ich persönlich habe die php.ini so eingestellt dass immer und alle Fehler angezeigt werden. Und auch öffentlich solltest du wenigstens die Fatal Error:'s anzeigen. Damit werden die Nutzer auf Fehler hingewiesen, die du entsprechend bearbeiten könntest.

Am besten wäre sogar, try/catch Blöcke zu benutzen und eigene Fehler zu werfen!
__________________
MfG DaemonTutorials - hoffe ich habe geholfen!

Mitwirkend: http://bogensport-lingen.de
daemonTutorials ist offline   Mit Zitat antworten
Alt 10.02.2011, 11:11  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

@daemonTutorials

Bitte beim Thema bleiben. Fehlerbehandlung steht hier nicht zur Diskussion.

Zitat:
Und auch öffentlich solltest du wenigstens die Fatal Error:'s anzeigen. Damit werden die Nutzer auf Fehler hingewiesen, die du entsprechend bearbeiten könntest.
Bitte nicht! Die Fehler loggst du entsprechend mit, solltest sie aber niemals potentiellen Angreifern zur Verfügung stellen.
Asipak ist offline   Mit Zitat antworten
Alt 10.02.2011, 11:12  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Es soll Leute geben, die nicht an die PHP.ini ihres Webspaces kommen. Für die sind die genannten Befehle ganz und gar nicht "dumm".
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zwei Scripts zur Datumsausgabe vereinen larsos PHP Tipps 2009 2 15.10.2009 19:48
[Erledigt] SELECT und UPDATE vereinen Lumio Datenbanken 6 18.03.2009 15:34
Doppelte Einträge vereinen PHP Tipps 2006 7 02.01.2006 16:06
3 Variablen in einer vereinen PHP Tipps 2005-2 5 19.09.2005 16:09
mehrere array vereinen? PHP Tipps 2005 8 14.02.2005 09:28
2 verschiedene Anfragen, zu einer Anfrage vereinen fender Datenbanken 4 23.11.2004 09:07

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
bild ebene php, php image transparente ebenen, php image transparente ebene, transparente bildebenen, mehrere bilder php png ebenen, php bilder ebenen, transparente farbe php, php bild über bild legen alpha, php png alpha transparenz, was versteht man unter alpha transparenz, html bildebenen, was macht imagealphablending, png bildebenen, transparent farbe vor bild php, php bilder alphatransparenz, transparente bildebene erstellen, mehrere bildebenen erstellen, hintergrundfarbe löschen alpha beibehalten, bilder php script transparent, php alpha beibehalten

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:25 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum