Avatar billede sebjlan Nybegynder
26. september 2004 - 21:37 Der er 20 kommentarer og
1 løsning

Dynamic Text Replacement virker ikke!

Hej!

Jeg refererer til http://www.alistapart.com/articles/dynatext/ hvor de forklarer hvordan man får et php-script til at danne et png-billede. Men skal tilmed også bruge et javascript.

Det har jeg forsøgt på http://gcboweb.ngdc.net/~mor/ men det ser ikke ud til at virke!
Jeg har HELT sikkert gjort noget galt eller også mangler jeg noget, da jeg ikke kan finde ud af php og JavaScript.

Mit PHP-script ser således ud:
<?php
/*
    Dynamic Heading Generator
    By Stewart Rosenberger
    http://www.stewartspeak.com/headings/   

    This script generates PNG images of text, written in
    the font/size that you specify. These PNG images are passed
    back to the browser. Optionally, they can be cached for later use.
    If a cached image is found, a new image will not be generated,
    and the existing copy will be sent to the browser.

    Additional documentation on PHP's image handling capabilities can
    be found at http://www.php.net/image/   
*/


$font_file  = 'font/ABSALOM.ttf' ;
$font_size  = 60 ;
$font_color = '#FF0000' ;
$background_color = '#99AAB8' ;
$transparent_background  = true ;
$cache_images = true ;
$cache_folder = 'cache' ;







/*
  ---------------------------------------------------------------------------
  For basic usage, you should not need to edit anything below this comment.
  If you need to further customize this script's abilities, make sure you
  are familiar with PHP and its image handling capabilities.
  ---------------------------------------------------------------------------
*/

$mime_type = 'image/png' ;
$extension = '.png' ;
$send_buffer_size = 4096 ;

// check for GD support
if(!function_exists('ImageCreate'))
    fatal_error('Error: Server does not support PHP image generation') ;

// clean up text
if(empty($_GET['text']))
    fatal_error('Error: No text specified.') ;
   
$text = $_GET['text'] ;
if(get_magic_quotes_gpc())
    $text = stripslashes($text) ;
$text = javascript_to_html($text) ;

// look for cached copy, send if it exists
$hash = md5(basename($font_file) . $font_size . $font_color .
            $background_color . $transparent_background . $text) ;
$cache_filename = $cache_folder . '/' . $hash . $extension ;
if($cache_images && ($file = @fopen($cache_filename,'rb')))
{
    header('Content-type: ' . $mime_type) ;
    while(!feof($file))
        print(($buffer = fread($file,$send_buffer_size))) ;
    fclose($file) ;
    exit ;
}

// check font availability
$font_found = is_readable($font_file) ;
if(!$font_found)
{
    fatal_error('Error: The server is missing the specified font.') ;
}

// create image
$background_rgb = hex_to_rgb($background_color) ;
$font_rgb = hex_to_rgb($font_color) ;
$dip = get_dip($font_file,$font_size) ;
$box = @ImageTTFBBox($font_size,0,$font_file,$text) ;
$image = @ImageCreate(abs($box[2]-$box[0]),abs($box[5]-$dip)) ;
if(!$image || !$box)
{
    fatal_error('Error: The server could not create this heading image.') ;
}

// allocate colors and draw text
$background_color = @ImageColorAllocate($image,$background_rgb['red'],
    $background_rgb['green'],$background_rgb['blue']) ;
$font_color = ImageColorAllocate($image,$font_rgb['red'],
    $font_rgb['green'],$font_rgb['blue']) ; 
ImageTTFText($image,$font_size,0,-$box[0],abs($box[5]-$box[3])-$box[1],
    $font_color,$font_file,$text) ;

// set transparency
if($transparent_background)
    ImageColorTransparent($image,$background_color) ;

header('Content-type: ' . $mime_type) ;
ImagePNG($image) ;

// save copy of image for cache
if($cache_images)
{
    @ImagePNG($image,$cache_filename) ;
}

ImageDestroy($image) ;
exit ;


/*
    try to determine the "dip" (pixels dropped below baseline) of this
    font for this size.
*/
function get_dip($font,$size)
{
    $test_chars = 'abcdefghijklmnopqrstuvwxyz' .
                  'ABCDEFGHIJKLMNOPQRSTUVWXYZ' .
                  '1234567890' .
                  '!@#$%^&*()\'"\\/;.,`~<>[]{}-+_-=' ;
    $box = @ImageTTFBBox($size,0,$font,$test_chars) ;
    return $box[3] ;
}


/*
    attempt to create an image containing the error message given.
    if this works, the image is sent to the browser. if not, an error
    is logged, and passed back to the browser as a 500 code instead.
*/
function fatal_error($message)
{
    // send an image
    if(function_exists('ImageCreate'))
    {
        $width = ImageFontWidth(5) * strlen($message) + 10 ;
        $height = ImageFontHeight(5) + 10 ;
        if($image = ImageCreate($width,$height))
        {
            $background = ImageColorAllocate($image,255,255,255) ;
            $text_color = ImageColorAllocate($image,0,0,0) ;
            ImageString($image,5,5,5,$message,$text_color) ;   
            header('Content-type: image/png') ;
            ImagePNG($image) ;
            ImageDestroy($image) ;
            exit ;
        }
    }

    // send 500 code
    header("HTTP/1.0 500 Internal Server Error") ;
    print($message) ;
    exit ;
}


/*
    decode an HTML hex-code into an array of R,G, and B values.
    accepts these formats: (case insensitive) #ffffff, ffffff, #fff, fff
*/   
function hex_to_rgb($hex)
{
    // remove '#'
    if(substr($hex,0,1) == '#')
        $hex = substr($hex,1) ;

    // expand short form ('fff') color
    if(strlen($hex) == 3)
    {
        $hex = substr($hex,0,1) . substr($hex,0,1) .
              substr($hex,1,1) . substr($hex,1,1) .
              substr($hex,2,1) . substr($hex,2,1) ;
    }

    if(strlen($hex) != 6)
        fatal_error('Error: Invalid color "'.$hex.'"') ;

    // convert
    $rgb['red'] = hexdec(substr($hex,0,2)) ;
    $rgb['green'] = hexdec(substr($hex,2,2)) ;
    $rgb['blue'] = hexdec(substr($hex,4,2)) ;

    return $rgb ;
}


/*
    convert embedded, javascript unicode characters into embedded HTML
    entities. (e.g. '%u2018' => '&#8216;'). returns the converted string.
*/
function javascript_to_html($text)
{
    $matches = null ;
    preg_match_all('/%u([0-9A-F]{4})/i',$text,$matches) ;
    if(!empty($matches)) for($i=0;$i<sizeof($matches[0]);$i++)
        $text = str_replace($matches[0][$i],
                            '&#'.hexdec($matches[1][$i]).';',$text) ;

    return $text ;
}

?>


Javascriptet:
http://gcboweb.ngdc.net/~mor/scripts/replacement.js

PHP-scriptet:
http://gcboweb.ngdc.net/~mor/scripts/heading.php


Mit spørgsmål er: Hvorfor virker det ikke? Og hvordan får jeg det så til at virke?

På forhånd mange tak!
Avatar billede erikjacobsen Ekspert
26. september 2004 - 21:50 #1
Error: Server does not support PHP image generation

...er det ikke forklaring nok?
Avatar billede sebjlan Nybegynder
26. september 2004 - 21:52 #2
Det står der ikke hos mig..
Avatar billede erikjacobsen Ekspert
26. september 2004 - 21:53 #3
Avatar billede sebjlan Nybegynder
26. september 2004 - 22:00 #4
Ja.. Der står intern server-fejl osv. men ikke at den ikke understøtter det..

Nå, nu har jeg uploadet scriptet til http://phpmor.ceep.dk/heading.php men hvis jeg prøver at skrive fx http://phpmor.ceep.dk/heading.php?text=hej står der "Error: The server is missing the specified font."
Avatar billede sebjlan Nybegynder
26. september 2004 - 22:01 #5
selvom font'en ligger i samme mappe som scriptet og der i scriptet står $font_file  = 'ABSALOM.ttf' ;
Avatar billede hmortensen Nybegynder
26. september 2004 - 22:02 #6
I din kode ovenfor, står stien til at ligge i 'font'
$font_file  = 'font/ABSALOM.ttf';
Avatar billede sebjlan Nybegynder
26. september 2004 - 22:03 #7
Hov rettede det lige fra
$font_file  = 'font/ABSALOM.ttf' ; til
$font_file  = 'ABSALOM.ttf' ;
men nu står der IKKE noget på http://phpmor.ceep.dk/heading.php?text=hej

:S
Avatar billede erikjacobsen Ekspert
26. september 2004 - 22:10 #8
Der står ikke "intern server fejl", men det jeg skrev før, hvis du ellers har
en browser, der vil vise dig det. Vink: brug noget andet end IE.
Og linket jeg snakker om er: http://gcboweb.ngdc.net/~mor/scripts/heading.php

Er det den samme server på phpmor ?
Avatar billede sebjlan Nybegynder
26. september 2004 - 22:14 #9
Jeg ved det ikke.. phpmor er hos b-one der lige har opdateret serverne.. den anden er Apache/1.3.31 Server at gcboweb.ngdc.net..

Men nu er det altså http://phpmor.ceep.dk/heading.php fremover.

Den kan læse scriptet og generere et billede, men den kan ikke finde font'en selvom jeg har rettet det fra font/ABSALOM.ttf til ABSALOM.ttf
Avatar billede erikjacobsen Ekspert
26. september 2004 - 22:15 #10
Ok, jeg kender intet til b-one, men det er da i hvert fald et bedre bud end den anden ;)
Avatar billede morteeart Nybegynder
26. september 2004 - 22:16 #11
Avatar billede sebjlan Nybegynder
26. september 2004 - 22:26 #12
>>> morteeart
Som skrevet i mit spørgsmål kender jeg ikke noget til php, så vil du være venlig at forklare mig hvad jeg skal gøre for at få det til at virke som beskrevet?

>>>erikjacobsen
Har du en idé til hvorfor mon scriptet ikke kan finde font'en?
Avatar billede sebjlan Nybegynder
26. september 2004 - 22:27 #13
Eller jeg mener, hvorfor den ikke skriver noget på http://phpmor.ceep.dk/heading.php?text=hej
Avatar billede erikjacobsen Ekspert
26. september 2004 - 22:29 #14
Det med fonten? Nej, ikke udover at også b-one skelner mellem store og små bogstaver i filnavne.
Det er man jo ikke vant til i windows-verdenen.
Avatar billede hmortensen Nybegynder
26. september 2004 - 22:30 #15
Erik, man behøver ikke bruge anden browser end IE, for at se fejlen, hvis man blot slåt friendly http errors fra
Avatar billede hmortensen Nybegynder
26. september 2004 - 22:31 #16
Har du prøvet med en anden skrifttype ?
Avatar billede sebjlan Nybegynder
26. september 2004 - 22:35 #17
Jeg havde dog skrevet med store bogstaver begge steder..
Nu har jeg rettet begge steder til absalom.ttf (både selve font'en og i scriptet) men det virker endnu ikke..

:(
Avatar billede morteeart Nybegynder
26. september 2004 - 22:37 #18
tjaa, den jeg postede er bare at kopiere souce filerne, og lægge skriftyperne i samme mappe som koderne... filnavne er det samme uden php.

og jo, B-one har GDlib2 supported..
Avatar billede sebjlan Nybegynder
26. september 2004 - 22:38 #19
nu er det en anden skrifttype..

wellsley.ttf
Avatar billede sebjlan Nybegynder
27. september 2004 - 08:13 #20
jeg forstår det simpelthen ikke..

Nu har jeg downloadet php-scriptet igen og kun rettet det jeg skal og gemt det som h1.php, men det virker stadig ikke!

$font_file  = 'absalom.ttf' ;
$font_size  = 60 ;
$font_color = '#000000' ;
$background_color = '#ffffff' ;
$transparent_background  = true ;
$cache_images = true ;
$cache_folder = 'cache' ;

Men der kommer ikke noget billede ved http://phpmor.ceep.dk/h1.php?text=hej..
Den kan godt genere et billede, det ser man hvis man ikke skriver noget efter h1.php .. Jeg ved også at den kan finde skrifttypen, for ellers ville den brokke sig over det..
hvad er der galt?
Det kan ikke være noget med javascriptet, for jeg skal jo først have h1.php til at lave det billede der bliver requested..
Avatar billede sebjlan Nybegynder
30. september 2004 - 15:47 #21
Hmm.. siden ingen er kommet med svar siden jeg sidst skrev, så lukker jeg tråden..

>>> erikjacobsen
Hvis du vil have nogle point for at have gjort mig opmærksom på at serveren ikke understøttede GDlib, opret da lige et svar ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester