php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.12.2006, 14:15  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard Bilder mit Transparenz "umrahmen"

Hallo zusammen,

ich habe ein Uploadscript gebastelt, was Bilder automatisch in der Größe anpasst. Erlaubt sind PNG, GIF, und JPG. Die Bilder werden, wenn Sie zu groß sind, verkleinert. Sind sie zu klein, sollen Sie "umrahmt" werden. Also es soll ein Rahmen in einer beliebigen Farbe um das Bild gezeichnet werden. Das funktioniert bei JPG-Bildern auch soweit ganz gut.

Jetzt möchte ich das ganze mit transparenten Bildern auch machen.

PHP-Code:
<?php
/** ImageResource erzeugen
 * @param int $width
 * @param int $height
 * @param int $bgcolor
 * @return resource $newResource
 */
function createResource($width=0$height=0$bgcolor=-1) {
    
// Anzahl Farben des Sourcebilds (0=jpg)
    
if($this->getSrcColors()==0) {
        
$tempResource imagecreatetruecolor($width$height);
    } else {
        
$tempResource imagecreate($width$height);
    }

    
// Transparenz erzeugen
    
$transparent  imagecolorallocate($tempResource000);
    if(
$transparent == $bgcolor)
        
$transparent imagecolorallocate($tempResource255255255);
    
imagecolortransparent($tempResource$transparent);
    
    
// Kasus knacktus
    
imagefill($tempResource00$transparent);
    if(
$bgcolor!=-1)
        
imagefill($tempResource00$bgcolor);

    return 
$tempResource;
}
?>
An der "Kasus knacktus"-Stelle scheidet sich jedoch der Weg. Entweder ich verliere die Transparenz aus meinem Quellbild, indem ich folgendes weglasse:
imagefill($tempResource, 0, 0, $transparent);
Oder ich verliere die Rahmenfarbe (zumindest wird sie durch die transparenz verfälscht)

Hat jemand ne Idee, wie ich beides kriegen kann? Transparenz und unverfälschte Rahmenfarbe?

Nötig wäre es in PHP4.

Gruß
Andreas
Andreas ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 16.12.2006, 11:17  
CIX88
Gast
 
Beiträge: n/a
Standard

1. Falls du es mitbekommen hast, steht dein Posting 2mal im Forum.
Daher kannst du den anderen Thread löschen.

2. Für die Umrandung wäre CSS effektiver, als hier extra die GDlib einzusetzen.
Natürlich ist es möglich, halte ich aber für Schnischnack.
  Mit Zitat antworten
Alt 16.12.2006, 17:57  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@CIX88: Hi. Jo du hast recht. Ist mir dann auch klar geworden, dass es mit HTML-Bordmitteln eigentlich einfacher geht. Das der Post 2 mal drin war, lag wohl am Firefox. Der hat manchmal ne Macke wenn ich auf Buttons oder Links klicke. Hat dann auch wohl 2 mal abgesendet.
Andreas ist offline   Mit Zitat antworten
Alt 16.12.2006, 18:54  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Notfalls bau mehrere Schritte ein. Setz das neue Bild z.B. aus den 3 notwendigen Bildern zusammen (einfarbiger Füller + Bild + einfarbiger Füller).
Zergling-new ist offline   Mit Zitat antworten
Alt 16.12.2006, 21:06  
CIX88
Gast
 
Beiträge: n/a
Standard

Zitat:
transparenten Bildern auch machen
Najaaaaaaa, das Bilder (z.B. GIF oder PNG) ihre Transparenz verlieren, wenn sie durch die GDlib gezogen werden ist hoffentlich bewusst.

Zitat:
$tempResource = imagecreate($width, $height);
Um unverfäschte Farben zu vermeiden, sollte diese Zeile in die Mülltonne verschwinden.
ImageCreate kennt nur 256 Farben

Zitat:
imagefill($tempResource, 0, 0, $transparent);
Du willst eine Fläche mit einer 100%ig transparenten Farbe füllen ?
Dann brauchste die gar nicht füllen
Du kannst mit ImageCopyMerge() ein Zusatz-Bild transparent über das Originalbild legen.
Aber so geht das nicht.

Zitat:
Oder ich verliere die Rahmenfarbe
Bei deinen Beispiel sehe ich gar nichts von einen Rahmen.
Wo wird dieser überhaupt gezeichnet ?
  Mit Zitat antworten
Alt 18.12.2006, 20:15  
Erfahrener Benutzer
 
Registriert seit: 17.02.2006
Beiträge: 132
PHP-Kenntnisse:
Fortgeschritten
marcusson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von CIX88
Najaaaaaaa, das Bilder (z.B. GIF oder PNG) ihre Transparenz verlieren, wenn sie durch die GDlib gezogen werden ist hoffentlich bewusst.
Das ist nicht korrekt. Die Transparenz bleibt sehr wohl erhalten, sofern man keine Änderungen an der Palette vornimmt, was allerdings sehr leicht (auch unabsichtlich) passieren kann.

Zitat:
Zitat von CIX88
Du willst eine Fläche mit einer 100%ig transparenten Farbe füllen ?
Dann brauchste die gar nicht füllen
Doch, doch. Genau das muss er sogar tun. Sonst ist 1. der Hintergrund per default schwarz und 2. würden beim Kopieren des Bildes die transparenten Flächen zu schwarz werden, weil eben der Wert des Alpha-Kanals zählt und die Farben der Pixel addiert werden. Schwarz + transparent ist eben schwarz.

Ich habe gerade einen 150kbyte OO-Wrapper für sämtliche in PHP enthaltenen Image-Funktionen geschrieben zuzüglich einiger weiterer Features und Portierung von PHP5-Features auf PHP4. Daher kenne ich diese und weitere nervige Details inzwischen aus nächster Nähe.

Das erste Problem bei dem oben genannten Skript ist, das die Palette nicht kopiert wird. Dadurch gehen die Frabinformationen flöten. Zweites Problem ist ein Denkfehler. Schwarz oder weiß als Farbe einfach zur Transparenzfarbe zu machen ist keine gute Idee. Denn wer kann schon sagen, ob das ursprüngliche Bild nicht zufällig schwarz oder weiß als nicht-transparente Farbe enthielt?

Nächstes Problem: imagecolortransparent() funktioniert nicht für True-Color, sondern nur für Palette-images. Für True-Color muss man stattdessen eine voll durchsichtige Farbe, also eine mit einem Alpha-Wert von 255 verwenden. Dafür dürfen True-Color Bilder aber auch mehrere transparente oder halbtransparente Farben haben.

Nächstes Problem: die Palette könnte bereits voll belegt sein. Man muss also zuerst die Palette des alten Bildes auf das neue Bild übertragen, dann die Transparenzfarbe herausfinden, dann die Fläche transparent machen und last-but-not-least, muss man in diesem Sonderfall für das ursprüngliche Bild die Palette um 1 Farbe reduzieren, um Platz für die neue Hintergrundfarbe zu schaffen. Dabei geht aber eventuell die Information über die Transparenzfarbe verloren, sodass man sie wiederherstellen muss, was wiederum nicht unbedingt erfolgreich sein muss, falls zufällig just die Transparenzfarbe Opfer dieser Optimierung geworden sein sollte... et cetera.

Ich habe das ganze Spielchen, wie gesagt, bis zum Erbrechen durch und bin sehr froh darüber, dass ich mir um die technischen Details keine Gedanken mehr machen muss und meine Klasse diese Dinge im Hintergrund für mich erledigt.

Zitat:
Zitat von CIX88
Bei deinen Beispiel sehe ich gar nichts von einen Rahmen.
Wo wird dieser überhaupt gezeichnet ?
Gar nicht. Der Rahmen ergibt sich durch die vergrößerte Leinwand.

Zitat:
Zitat von CIX88
Du kannst mit ImageCopyMerge() ein Zusatz-Bild transparent über das Originalbild legen.
Nein. Das geht nicht, weil das Originalbild hier kleiner ist als das zusätzliche Bild.

imagecopymerge() wäre außerdem an dieser Stelle nicht sinnvoll, weil sie 1. nur für True-Color anwendbar ist und 2. benötigt man die Transparenzangaben, welche diese Funktion bietet, nicht. Außerdem: es steht zwar nicht direkt im Handbuch, aber ich glaube mich zu erinnern, dass bei dieser Funktion auch der Alpha-Kanal bzw. die Transparenz des Originalbildes verloren geht. Also Finger weg davon, solange man diese spezielle Funktionalität nicht explizit braucht.
marcusson ist offline   Mit Zitat antworten
Alt 19.12.2006, 11:24  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Das is mal n fetter Beitrag. Könnte man fast n Tutorial draus machen.


*dreistmode_on* Ist die class von dir open source? :P *dreistmode_off*

Ich werd mal schauen. Also 150kb zu laden, um einen Rahmen zu zeichnen, halte ich für übertrieben. Die CSS-Lösung ist da weitaus kompfortabler.

Aber Danke
Andreas ist offline   Mit Zitat antworten
Alt 20.12.2006, 07:03  
CIX88
Gast
 
Beiträge: n/a
Standard

@marcusson

Ist zwar guter Text, aber einiges ist nicht ganz richtig.
Habe allerdings keine Lust, jetzt hin und her zu schreiben !

Nur gut, dass ich noch nie etwas mit den Image-Funktionen gemacht habe .... daher habe ich mir natürlich alles ausgedacht
  Mit Zitat antworten
Alt 20.12.2006, 14:45  
Erfahrener Benutzer
 
Registriert seit: 23.08.2007
Beiträge: 1.510
M3g4Star befindet sich auf einem aufstrebenden Ast
Standard

Oh man .. besorgt euch ImageMagick .. und die entsprechende OpenSource Klasse .. erweitert die Klasse um einige Funktionen und ihr könnt euch die ganze Diskussion sparen. Weil ich ImageMagick an sich bevorzugen würde bei der Grafik-hin-und-her-wurschtelei


Zitat:
Zitat von cix88
Nur gut, dass ich noch nie etwas mit den Image-Funktionen gemacht habe .... daher habe ich mir natürlich alles ausgedacht
*hrhr* Jo Stümmt .. war gar nicht deine Seite mit den verschiedenen Klassen und Funktionen und einigen Grafikspielereien ...

Mensch ..

M3g4Star ist offline   Mit Zitat antworten
Alt 20.12.2006, 17:26  
CIX88
Gast
 
Beiträge: n/a
Standard

Zitat:
Oh man .. besorgt euch ImageMagick
Naja, nicht immer so einfach, wenn der Hoster das nicht erlaubt
Ich hätte es gerne mal selber ausprobiert, aber nöööööö ....

[OT]

Oh coole Weihnachts-Smilies
  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
Bilder ohne DB sicher speichern Diet PHP Tipps 2005 6 25.03.2009 00:07
bilder überlagern Masteroi PHP Tipps 2008 0 27.03.2008 09:08
Zip Archiv entpacken und Bilder verkleinern Simon9990 PHP Tipps 2008 5 08.10.2007 00:32
Bilder in HTML-Mails werden willkürlich "verissen" hoffnungsloser PHP-Fortgeschrittene 3 25.04.2007 14:48
bilder zu groß?! lindner PHP Tipps 2006 9 19.10.2006 08:32
Bilder löschen die öffter vorhanden sind?! Peoples PHP Tipps 2006 6 28.05.2006 19:34
Bilder "schützen" PHP Tipps 2006 4 06.03.2006 15:25
Bilder löschen PHP Tipps 2005-2 4 24.10.2005 11:37
Bilder aus einem unterverzeichis anzeigen.Hilfe PHP Tipps 2005-2 3 12.09.2005 15:36
Mehrere Bilder Hochladen und bearbeiten PHP Tipps 2005-2 7 23.07.2005 13:48
Bilder in Tabellen nixdorf HTML, Usability und Barrierefreiheit 36 09.05.2005 21:15
Bilder nach Namen anzeigen PHP Tipps 2005 11 06.03.2005 15:41
Bilder aus der Datenbank Skazi Datenbanken 2 09.02.2005 13:42
Bilder upload (Massen) PHP Tipps 2005 11 06.01.2005 14:14
Bildübersicht alle Bilder im Ordner... PHP Tipps 2004 46 07.08.2004 20:20

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
weihnachtsumrandungen, weihnachtsumrandung bilder, bilder umrahmen, bild umrahmen, umrahmung für bilder, umrahmung für bilder-transparent, http://www.php.de/php-fortgeschrittene/43065-bilder-mit-transparenz-umrahmen.html, weihnachtsumrandung, umrahmung weihnachten, imagecolorallocate transparent, php createimage mit überlagerung wird schwarz, imagemagik transparenzfarbe, welcher farbcode ist bei jpg fast transparent, umrahmung weihnachten html, php fortgeschritten grafik alphakanal, bild umrahmung, jpg umrahmung, imagecopymerge schwarz, imagemagick transparent bild erweitern, quelltext transparenter rand um das bild java

Alle Zeitangaben in WEZ +2. Es ist jetzt 21: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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.