"We are back" « oc.at

PHP(gd): problem mit ImageCopyResized

flocky 28.09.2005 - 13:38 916 10
Posts

flocky

sn0wner (analphabet)
Avatar
Registered: May 2002
Location: life-compiler
Posts: 1663
ich habe ein script welches 2 bilder einliest. das eine ist das bild was ge-watermarked werden soll (jpeg), das andere ist das watermark (gif). bevor das watermark über das pic gelegt wird wirds noch auf die größe angepasst.
Code: PHP
$watermarkcopywidth = $origwidth * 0.9;
$watermarkcopyheight = $watermarkcopywidth / ($watermarkwidth / $watermarkheight);
$newwatermark = ImageCreateTruecolor($watermarkcopywidth,$watermarkcopyheight);
ImageCopyResized($newwatermark,$watermark, 0,0,0,0, $watermarkcopywidth,$watermarkcopyheight, $watermarkwidth,$watermarkheight);
das problem is jetz dass das ergebnis ($newwatermark) einfach schwarz ist. mittlerweilie bin ich draufgekommen dass es daran liegt dass das watermark als gif transparenz enthält. wenn ich das selbe gif ohne transparenz verwende funktionierts, nur die transparenz brauch ich weil ich das watermark eben mit alphablending über das gesamte pic lege.

zusammenfassend: ImageCopyResized hat einfach ein problem mit transparenten gif-files, kann ich da irgendwas machen? prinzipiell gehts ja nur darum das watermark passend zum pic zu resizen, ohne resize funktioniert ja alles.
Bearbeitet von flocky am 28.09.2005, 13:52

flocky

sn0wner (analphabet)
Avatar
Registered: May 2002
Location: life-compiler
Posts: 1663
solved über ein workaround:

gif ohne transparency, dafuer mit markanter hintergrundfarbe und selbige dann durch transparency ersetzt.
Code: PHP
$gay = imageColorAllocate ($newwatermark, 255, 0, 255);
ImageColorTransparent($newwatermark,$gay);

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Ich weiss, es ist schon solved... aber :)

Wenn du statt einem GIF ein PNG verwendest hast du's viel einfacher PLUS du hast Farben mit ALPHA-Channel, also kannst du schöne Kanten usw. erzeugen ;)

Noch was: Wenn du das Watermark im GD oder GD2 Format ablegst und dann immer dieses verwendest, solltest du wesentlich bessere Performance erreichen, da das GD(2) Format im wesentlichen einem Memory-Dump entspricht, was natürlich das laden beschleunigt.
Bearbeitet von watchout am 28.09.2005, 14:53

flocky

sn0wner (analphabet)
Avatar
Registered: May 2002
Location: life-compiler
Posts: 1663
okay, danke für den tipp. wär nur noch gut zu wissen wie ich ein pic als gd speichere :D
hast einen function-tip wie ich das alpha für einzelne channels verarbeiten kann?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von flocky
okay, danke für den tipp. wär nur noch gut zu wissen wie ich ein pic als gd speichere :D
hast einen function-tip wie ich das alpha für einzelne channels verarbeiten kann?
Speichern: http://mirrors.inway.cz/manual/en/function.imagegd2.php bzw. http://mirrors.inway.cz/manual/en/function.imagegd.php - kommt halt darauf an welche GD du verwendest.

Alpha für Channels? Du meinst für R, G, B einzelne Alpha-Werte? AFAIK ist das Color-Format einfach RGBA, demnach kann nur eine "Farbe" - bzw. bessergesagt ein Pixel einen bestimmten Alpha-Wert haben, aber nicht ein Farbkanal. vielleicht meinst du auch was ganz anderes - klär mich auf ;)

flocky

sn0wner (analphabet)
Avatar
Registered: May 2002
Location: life-compiler
Posts: 1663
ah, also doch mit imagegd2... gut danke

naja eigentlich hab ich eh das gemeint was du gemeint hast :D
mit ImageColorAllocateAlpha gehts ja anscheinend, nur hab ich ned ganz überrissen was das jetz genau macht. wenn ich mir das beispiel im manual anschau dann werden mal farben im pic mit einem alphawert definiert. jetz weiß ich aber nicht genau was ich damit anfangen soll, bzw. WIE ich anfangen soll. was ich ja will is das watermarkpic herzunehmen und für bestimmte farben alphawerte zu verteilen damit das watermark im endeffekt nicht 'jaggy' ist, das heisst ich brauch dazwischen auch farben, aber das wär ja mühsame kleinarbeit... oder hast du was anderes gemeint?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Du nimmst dein Watermark-Pic, nimmst Photoshop - oder ein ähnliches Programm - nimmst die Ebene, setzt sie auf x% Alpha und speicherst das ganze als PNG ab. GD2 sollte afaik schon volles Alpha usw. unterstützen.
Auf die Art reduzierst du auch die Arbeit die das Script zu machen hat...

flocky

sn0wner (analphabet)
Avatar
Registered: May 2002
Location: life-compiler
Posts: 1663
hm naja ich hab jetz mal testweise das watermark ziemlich geblured (=>verwischt) damit der effekt besser sichtbar ist, für die einzelnen channels alpha festgelegt, das ganze hab ich dann als png gespeichert, is auch transparent. aber jetz komm ich wieder auf mein ursprüngliches problem zurück, ImageCopyResized nimmt mir die transparency wieder nicht. was transparent sein sollte ist wieder schwarz... wie gesagt gehts nur ums resizen, wenn ich das pic in der originalgröße nehmen könnte dann wär alles kein problem.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
hmm, und du hast sicher als png-24 gespeichert?

flocky

sn0wner (analphabet)
Avatar
Registered: May 2002
Location: life-compiler
Posts: 1663
naja es hat 32 bit farbtiefe, solltens zwingend 24 sein?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
öh 32 bit PNG gibts afaik nicht, nur 24 bit Farbe + 8 Bit Alpha...

Schon imagecopyresampled probiert?

Das kommt mir echt komisch vor... Das einzige was das erklären würde is dass die GD einfach kein Alpha beim resizen unterstützt...
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz