webForumDet fria alternativet

Skapa PNG-bild (med transparens) från textsträng

PHP

23 svar · 911 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#1

Använder detta skript för att producera en bild utifrån en textsträng. Det funkar bra, men bilden blir ju licksom lite "grynig" mot en bildbakgrund... Jag skulle vilja att den får en fin transparens (typ png-24-kvalitet). Går det??

Medlem sedan jan. 2003247 inlägg
#2

IE stöder tydligen inte PNG med trans. De finns ett ful hack för att få det att fungera.
Sök i Css forumet på PGN så hittar du säker massa bra information om problemet

Medlem sedan jan. 20051 130 inlägg
#3

flumpa skrev:

IE stöder tydligen inte PNG med trans. De finns ett ful hack för att få det att fungera.
Sök i Css forumet på PGN så hittar du säker massa bra information om problemet

Det är jag medveten om, men nu blir den även ful i FF. Tror inte bilden blir av typen png 24 i det skript jag använder. Jag undrar därför om man kan korrigera skriptet så bilderna blir finare..??

Medlem sedan jan. 20051 130 inlägg
#4

...ingen som vet, inget som vet...?

Medlem sedan jan. 20051 130 inlägg
#5

Har nu kommit en bit på vägen. Kom på att man kanske kan lägga texten på en genomskinlig bild... och på så sätt undvika de fula kanterna... Men nej nej. Blir lika illa ändå. Lägger jag en textstring på bilden mha funktionen "imagestring" så blir det ju snyggt, fast jag vill ju kunna välja font på texten!

Bifogar kod och de bilder (den genomskinliga som texten skrivs på och bakgrundsbilden som textbilden sedan läggs på) jag använder, så ni kan testa själva.

Snälla hjälp mig!

<?php 
header("Content-type: image/png");

$im = imagecreatefromgif('genomskinlig_bild.gif'); 
$white = imagecolorallocatealpha($im, 255, 255, 255, 75);

$string = "En text";

imagettftext($im, 14, 0, 10, 20, $white, "trebuc.ttf", $string); 
imagestring($im, 3, 10, 20, $string, $white);

imagepng($im, '', 0); 
imagedestroy($im); 
?>
genomskinlig_bild.gifbakgrund.jpg
Medlem sedan aug. 20002 975 inlägg
#6

Du kan välja font för imagestring() med imageloadfont, men det blir då inte dina vanliga ttf-fonter.

Du har max 2 argument/parametrar till funktionen imagepng(), men då du inte ska spara filen räcker det med den första.

Men varför göra en mellanladdning i en PNG-fil, varför inte lägga texten direkt på bilden ?

Medlem sedan jan. 20051 130 inlägg
#7

Du kan välja font för imagestring() med imageloadfont, men det blir då inte dina vanliga ttf-fonter.

Vad menar du med "inte dina vanliga", vilka är de då? Funkar det som så att jag lägger valbara fonter i en mapp på servern eller?

Men varför göra en mellanladdning i en PNG-fil, varför inte lägga texten direkt på bilden ?

Så här ligger det till: Bakgrundsbilden som "textbilden" ligger på är inte bestämd utan skall enkelt kunna bytas ut, och dessutom så vill jag enkelt kunna flytta texten runt på bakgrunden. Bakgrundsbildens url och texten som skall skrivas ut hämtas från en databas.

Tipsa mig gärna om ett smartare sätt att lösa detta på!

Jag vill helt enkelt att det ska se ut som att texten är ditskriven på bakgrunden i Photoshop eller liknande. Ska se ut som en färdig bild...

Medlem sedan aug. 20002 975 inlägg
#8

Följde du länken till imageloadfont som jag gav tidigare så hade kanske förstått mer om fonterna, och hur du ska gå tillväga för att ändra.
Fonterna kan du enligt användarnoteringarna få tag på här, om det inte är så du vill göra egna.

Du har två vägar att följa.

1. Du har en PNG-fil som du bygger upp med din text.
Med GD slår du samman PNG-bilden med den bild du vill ha.
Exempel har du här.

2. Du lägger texten direkt på bilden med GD.
Exempel har du här.

I bägge fallen kan du välja om du vill spara den sammanslagna bilden, eller generera den "on the fly".

Medlem sedan jan. 20051 130 inlägg
#9

Tack!

GDF-fonterna är ju mindre läckra... Kan man välja storlek och isf hur?

2. Du lägger texten direkt på bilden med GD.
Exempel har du här.

Detta skulle kunna va intressant. Kan man lägga texten på en bakgrund istället för på en bild?

Medlem sedan aug. 20002 975 inlägg
#10

Själv skulle jag utan tvekan välja att använda mig av imagettftext istället.
Storleken anger du i andra parametern, i points.

För imagestring kan man ange storleken i den andra parametern. Värden du kan ge är 1 till 5.
Huruvida det även finns fem storlekar i andra fonter du laddar ner har jag ingen aning om.

Vill du ha en bakgrundsfärg istället för bild, kan du använda dig av imagecreate för att skapa bilden.

Medlem sedan jan. 20051 130 inlägg
#11

Jag menar att jag vill ha texten utskriven på en bakgrund istället för på en bild. Typ så här:

<div style="background-image:url(textgenerator.php?text=lite text); width:100px; height:100px">
</div>

istället för så här:

<img src="textgenerator.php?text=lite text" />

Går det på ngt sätt att åstadkomma?

Medlem sedan aug. 20002 975 inlägg
#12

Det borde fungera tycker jag.

Fast du får nog köra rawurlencode på textsträngen först.

Medlem sedan jan. 20051 130 inlägg
#13

Det funkar även det, men kvalitén på bilden efteråt suger rent ut sagt.
Detta är koden:

<br />
Original:<br />
<div style="background-image:url(bakgrund.jpg); width:500px; height:100px">
</div>
<br />
<br />
Text på bild:<br />
<img src="test4.php?text=Enlitentext&font=verdana">
<br />
<br />
Text på bakgrund:<br />
<div style="background-image:url(test4.php?text=Enlitentext&font=verdana); width:500px; height:100px">
</div>
header("Content-type: image/jpeg"); 

$im = imagecreatefromjpeg('bakgrund.jpg'); 
$trans_white = imagecolorallocatealpha($im, 255, 255, 255, 75);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

$text = $_GET["text"];
$font = $_GET["font"];

imagettftext($im, 20, 0, 10, 50, $black, $font, $text); 

imagejpeg($im); 
imagedestroy($im);

Bifogar bilder på resultatet och en inzoomning på hur kvalitén försämras.

Finns det något sätt för att behålla kvalitén på bilden??

resultat.jpgkvalitet.jpg
Medlem sedan aug. 20002 975 inlägg
#14

Något bättre bör det blir om du ändrar till

imagejpeg($im, '', 95);

70 är defaultvärdet för kvalitetsparametern om du inte anger något. 95 har jag upplevt ger ungefär samma filstorlek som originalet.

Medlem sedan jan. 20051 130 inlägg
#15

Jag bytte till

imagepng($im)

och då blev kvalitén kanonbra igen. Det är väl ett bra sätt?

Medlem sedan aug. 20002 975 inlägg
#16

Om PNG är lämplig för bilden är det ett bra sätt. JPEG är nästan alltid lite förstörande.

Hur blev annars kvaliteten näer du ändrader till 95 i kvalitet på JPEG ?

Medlem sedan jan. 20051 130 inlägg
#17

Matte skrev:

Hur blev annars kvaliteten näer du ändrader till 95 i kvalitet på JPEG ?

Hyfsad, bättre i PNG.

Medlem sedan jan. 20051 130 inlägg
#18

Upptäckte att detta inte fungerar i Opera :q :q :q
Exakt samma kod funkar finfint i både FF och IE..!! Vad kan detta bero på, snälla hjälp mig!

<div style="background-image:url(php/funktioner/textgen.php?t=litetext&f=verdana&image=bild&s=40&a=30); width:100px; height:100px">
</div>
<?php 
header("Content-type: image/png"); 

$text = $_GET["t"];
$alpha = $_GET["a"];
$size = $_GET["s"];
$font = "../../fonter/".$_GET["f"];
$im = imagecreatefromjpeg('../../bilder/'.$_GET["image"].'.jpg'); 

$trans = imagecolorallocatealpha($im, 255, 255, 255, $a);

imagettftext($im, $s, 0, 0, $s, $trans, $f, $t); 

imagepng($im); 
imagedestroy($im); 
?>
Medlem sedan aug. 20002 975 inlägg
#19

Har du mellanslag eller liknande i "litetext" ?
Testa då att först köra texten genom rawurlencode.

Medlem sedan jan. 20051 130 inlägg
#20

Ja jag har mellanslag och &-tecken i "anropet", men jag kör rawurlencode på det, och det funkar ju i FF och IE...Hmm..

258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)