PHP(gd): problem mit ImageCopyResized
flocky 28.09.2005 - 13:38 916 10
flocky
sn0wner (analphabet)
|
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. $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)
|
solved über ein workaround: gif ohne transparency, dafuer mit markanter hintergrundfarbe und selbige dann durch transparency ersetzt. $gay = imageColorAllocate ($newwatermark, 255, 0, 255);
ImageColorTransparent($newwatermark,$gay);
|
watchout
Legendundead
|
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)
|
okay, danke für den tipp. wär nur noch gut zu wissen wie ich ein pic als gd speichere  hast einen function-tip wie ich das alpha für einzelne channels verarbeiten kann?
|
watchout
Legendundead
|
okay, danke für den tipp. wär nur noch gut zu wissen wie ich ein pic als gd speichere  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)
|
ah, also doch mit imagegd2... gut danke naja eigentlich hab ich eh das gemeint was du gemeint hast  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
Legendundead
|
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)
|
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
Legendundead
|
hmm, und du hast sicher als png-24 gespeichert?
|
flocky
sn0wner (analphabet)
|
naja es hat 32 bit farbtiefe, solltens zwingend 24 sein?
|
watchout
Legendundead
|
ö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...
|