[PHP] aliasing met GD functie imagettftext

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 19:55
Ik wil met PHP tekst genereren, zoals in MS Paint op een Windows XP machine.

We hebben een systeem gebouwd wat een plaatje kan versturen naar een display. Met de GD functie in php om een string op een plaatje te zetten gaat dat niet helemaal volgens verwachting.

Standaard genereert die functie een stuk text op basis van een TrueTypeFont. Anti-aliasing staat daarbij standaard aan, maar je kunt dat omzeilen door de kleur negatief te maken.

Dit is wat ik wil:
Afbeeldingslocatie: http://www.plaatjesupload.nl/bekijk/2010/02/23/1266936042-450.jpg

Dit is wat we nu krijgen (met aliasing):
Afbeeldingslocatie: http://www.plaatjesupload.nl/bekijk/2010/02/23/1266935909-920.png

Iemand een idee hoe dit op te lossen met PHP?

Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Post eens een stuk relevante code?

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • 8088
  • Registratie: December 2000
  • Niet online

8088

NaN

Met imagestring kun je AA vermijden.

Afbeeldingslocatie: http://www.awesomatic.net/blah.php

Met imageloadfont kun je eventueel bitmap fonts gebruiken.

Do you seek to engage in or have you ever engaged in terrorist activities, espionage, sabotage, or genocide?


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dit topic heeft weinig zin zonder een stukje relevante code. imagettftext zou prima moeten anti-aliasen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 19:55
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$this->_image = imagecreate($label->dimensions["width"], $label->dimensions["height"]);
$colorWhite = imagecolorallocate($this->_image, 255, 255, 255);
imagefill($this->_image, 0, 0, $colorWhite);


$blackColor = imagecolorallocate($this->_image, 1, 1, 1);
            
imagettftext($this->_image, 
    $templateTextItem->fontSize, 
    0, 
    $templateTextItem->pointX, 
    $templateTextItem->pointY, 
    -$blackColor, 
    "c:/windows/fonts/" . $templateTextItem->font .".ttf", 
    $templateTextItem->text);


Font kan dus verschillen. Imagestring hebben we al geprobeerd en vervolgens een fontimage ingeladen, maar dat resultaat was nog slechter.

[ Voor 21% gewijzigd door T i M op 23-02-2010 18:30 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Twee dingen: is het niet per ongeluk een GIF-image? En heb je die functie-aanroep ook met alle waarden ingevuld, zodat we weten wat je eigenlijk voor parameters doorgeeft?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Beide plaatjes die je post zijn niet ge-anti-aliased (dus -$blackColor ipv gewoon $blackColor werkt blijkbaar). Het probleem is enkel dat je niet tevreden bent met het resultaat omdat het lettertype in het tweede geval niet mooi in het raster past - maar daar kan PHP weinig aan doen lijkt mij, dan moet je een andere grootte of ander font kiezen. Wat is er mis met anti-aliasing? :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:27

Matis

Rubber Rocket

PHP adviseert het gebruik van imagecreatetruecolor

edit; wat zegt je phpinfo() over de GD-lib en je PHP-versie?

edit2; wat voor Content-type gebruik je?

[ Voor 45% gewijzigd door Matis op 23-02-2010 19:16 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

D'oh, die had ik gemist. Klopt inderdaad, dit is het soort crap dat je krijgt als je imagecreate aanroept in plaats van imagecreatetruecolor. Net zoiets als imagecopyresized vs. imagecopyresampled. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 19:55
Om de een of andere vage reden werkte het gister niet met imagecreatetruecolor, ik kreeg toen de anti-aliasing niet weg. Als ik de comments doorlees op PHP.net dan zijn er mensen met soortgelijke problemen, welke adviseerde om imagecreate te gebruiken.

Ik maak nu gebruik van imagecreatetruecolor, en het resultaat is hetzelfde.

PHP Versie: 5.3.1
GD Version: 2.0.34

Heb even een testscript gemaakt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
phpinfo();
// Create a 300x100 image
$im = imagecreatetruecolor(300, 100);
$black = imagecolorallocate($im, 1,1,1);

$colorWhite = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $colorWhite);


$font_file = "c:/windows/fonts/arial.ttf";

imagefttext($im, 11, 0, 105, 55, -$black, $font_file, 'Dit is een tekst');

header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>


De tekst ziet er niet heel verkeerd uit, maar op de meeste letters zitten hier en daar wat teveel pixels. Op de display die we gebruiken ziet dat heel lelijk uit. Als ik een plaatje maak met tekst in MS Paint dan is het resultaat goed.

Hier nog even een comment van php.net
Ref: Craig at frostycoolslug dot com

"Using the negative of a color index has the effect of turning off antialiasing."

This is true, but only if the image has been created with imagecreate() (as opposed to imagecreatetruecolor())

[ Voor 12% gewijzigd door T i M op 24-02-2010 08:20 ]


Acties:
  • 0 Henk 'm!

  • Spiked
  • Registratie: Mei 2008
  • Laatst online: 24-07 14:50
Hier is je snippet goed wanneer je $black niet negatief maakt.
Afbeeldingslocatie: http://img522.imageshack.us/img522/7059/blackju.png

[ Voor 36% gewijzigd door Spiked op 24-02-2010 08:35 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

T_i_M: je weet dat AA uitzetten juist kartelrandjes betekent en dat je dus precies probeert te bereiken wat je volgens je topicstart juist niet wil? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DrFlash
  • Registratie: Juli 2009
  • Laatst online: 05-03 12:59
Als ik het - teken voor $black weg haal dan werkt het inderdaad perfect.

Wowhead profiel


Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 19:55
Ik wil juist wel een pixelachtige tekst. Zoom maar eens in met een tekenprogramma op het plaatje wat ik heb gepost en vervolgens op de "normale" output van imagettftext() dan snap je precies wat ik bedoel.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

In dat geval heb je gewoon het verkeerde lettertype geselecteerd ;)

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

NMe schreef op woensdag 24 februari 2010 @ 12:22:
T_i_M: je weet dat AA uitzetten juist kartelrandjes betekent en dat je dus precies probeert te bereiken wat je volgens je topicstart juist niet wil? ;)
Ik haal uit de startpost anders juist precies dat hij wel degelijk die kartelrandjes wil.

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:27

Matis

Rubber Rocket

http://www.dafont.com/pixelation.font die gebruiken en klaar is kees :P

Of zoek hier een leuke uit: http://www.dafont.com/bitmap.php

[ Voor 31% gewijzigd door Matis op 24-02-2010 19:02 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 19:55
@ matis

Dat is een optie, het enige probleem is dat die fonts voor een bepaalde grootte zijn gemaakt. Zodra ik een andere font-size wil krijg ik een scheve verhouding. Nog steeds geen ideale oplossing, helaas.

Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 19:55
Kickje. Ik zit nog steeds met hetzelfde probleem. Bitmap fonts gebruiken is niet de oplossing, aagezien die voor een bepaalde grootte zijn ontworpen en er zitten niet alle karakters in, zoals het euro teken.

Iemand die hier een oplossing voor heeft?

Ik heb inmiddels ook met de Imagick library getest, maar daar is het resultaat hetzelfde.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Schrijven met een grote lettergrootte (4x zo groot als wat je wil) en vervolgens de image verkleinen naar het formaat dat je wil is geen optie zeker? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1