Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  19 1198
Jeg har lyst til å generere bilder i php, og det er jo hyggelig. Jeg googlet en guide, kopierte litt kode, og det fungerte flott. Derimot fant jeg plutselig ut at hvis det ligger annen kode enn den som inkluderer bildet på siden, fungerer det ikke, derimot får jeg bare masse tilfeldige tegn. Hvorfor i huleste skjer dette? Under følger koden jeg kopierte.

Kode

$my_img = imagecreate( 200, 80 );
$background = imagecolorallocate( $my_img, 0, 0, 255 );
$text_colour = imagecolorallocate( $my_img, 255, 255, 0 );
$line_colour = imagecolorallocate( $my_img, 128, 255, 0 );
imagestring( $my_img, 4, 30, 25, "Generated image",
  $text_colour );
imagesetthickness ( $my_img, 5 );
imageline( $my_img, 30, 45, 165, 45, $line_colour );

header( "Content-type: image/png" );
imagepng( $my_img );
imagecolordeallocate( $line_color );
imagecolordeallocate( $text_color );
imagecolordeallocate( $background );
imagedestroy( $my_img );
Trigonoceps occipita
vidarlo's Avatar
Donor
Fordi du serverer feil/manglande mime-type i headeren.
Sitat av slashdot Vis innlegg
Fordi du serverer feil/manglande mime-type i headeren.
Vis hele sitatet...
Såe... Kva for ein mime-type skal eg bruke?
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av Kyrios Vis innlegg
Såe... Kva for ein mime-type skal eg bruke?
Vis hele sitatet...
Den rette for bildetypen du serverer. For PNG er det vel Image/PNG som er korrekt mime-type.
Sitat av slashdot Vis innlegg
Den rette for bildetypen du serverer. For PNG er det vel Image/PNG som er korrekt mime-type.
Vis hele sitatet...
Men å spesifisere dette i headeren fører jo til at all HTML og PHP blir vist som plaintext. Det er virkelig ikke ønskelig.
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av Kyrios Vis innlegg
Men å spesifisere dette i headeren fører jo til at all HTML og PHP blir vist som plaintext. Det er virkelig ikke ønskelig.
Vis hele sitatet...
Hæ? PHP blir vist som plaintext av at du sender korrekt mime-type?

Her er det *virkelig* på sin plass med litt meir kode enn det du har spadd opp. Heile scriptet takk. For det du har over spytter ut et PNG-bilde, og ingenting anna. Det kan du igjen bruke i ei vilkårlig html-side ved hjelp av img-taggen.
Sitat av slashdot Vis innlegg
Det kan du igjen bruke i ei vilkårlig html-side ved hjelp av img-taggen.
Vis hele sitatet...
Ah, er det slik å forstå. Dette fungerte bedre. Noen spørsmål har jeg allikevel. Hvis jeg i bildet ønsker å legge til noen variabler, men variablene ligger i en .php fil, hva gjør jeg? Og bildet, altså php-fila, lar seg heller ikke lagre - noe å gjøre med dette?
z0p
uʍop ǝpısdn
z0p's Avatar
Du kan jo sende query med GET i bildeuri og lese de inn i scriptet. Du har forsatt feil mimetype tipper jeg, men siden du bruker img-taggen tipper muligens nettleseren på mime selv
Sitat av z0p Vis innlegg
Du kan jo sende query med GET i bildeuri og lese de inn i scriptet. Du har forsatt feil mimetype tipper jeg, men siden du bruker img-taggen tipper muligens nettleseren på mime selv
Vis hele sitatet...
Jeg spesifiserer klart og tydelig at "header( "Content-type: image/png" );". Men det egentlige spørsmålet er: Det er altså ingen måte å generere et bilde midt på en side, uten at bildet genereres i en annen fil?
z0p
uʍop ǝpısdn
z0p's Avatar
Dårlig av meg å svare utifra andre svar, uten å lese førstepost grundig. My bad!

Det er mulig å generere både html og bildet i samme dokument dersom du legger bildedata i en data uri. Da må du generere bilde, encode som f.eks base64, lage en korrekt data uri og deretter sette den som href attributet i et img-element i dokumentet. Om denne løsningen er ønskelig eller optimal er noe annet. Det blir en del mer rotetete i hvert fall.

Et veldig enkelt bilde kan jo også genereres i javascript, dog definitivt ikke optimalt.

Den beste løsningen avhenger i det hele tatt av problemet, så du kan muligens få et bedre svar om du forteller om utfordringen

btw, koden du postet er den du kopierte? og som fungerer? Kan du ikke heller vise den som ikke fungerer?
Sist endret av z0p; 7. august 2010 kl. 01:32.

Kode

echo 'div id="boks">';

$my_img = imagecreate( 200, 80 );
$background = imagecolorallocate( $my_img, 0, 0, 255 );
$text_colour = imagecolorallocate( $my_img, 255, 255, 0 );
$line_colour = imagecolorallocate( $my_img, 128, 255, 0 );
imagestring( $my_img, 4, 30, 25, "Generated image",
  $text_colour );
imagesetthickness ( $my_img, 5 );
imageline( $my_img, 30, 45, 165, 45, $line_colour );

header( "Content-type: image/png" );
imagepng( $my_img );
imagecolordeallocate( $line_color );
imagecolordeallocate( $text_color );
imagecolordeallocate( $background );
imagedestroy( $my_img );

echo '</div>';
Koden over fungerer ikke. Siden jeg prøver å generere bildet på er mye større, men poenget kommer klart nok frem: Det er både PHP og HTML over og under koden, noe som gjør at headeren ikke kan være en bildetype.
Lite kontroversiell
ticks's Avatar
Hvorfor ikke legge den bildegenererende delen av scriptet i en egen fil? Det eneste fila da gjør er å lage bildet, og returnere det.

Så lager du en HTML-side for HTML-koden hvor du putter PHP-fila inn i en img-tag. Lekende lett.

EDIT: Du kan forresten ikke endre headeren ETTER at du har sendt output til browseren slik du har gjort ovenfor.
Sist endret av ticks; 7. august 2010 kl. 01:49.
z0p
uʍop ǝpısdn
z0p's Avatar
Da må du bruke data uri som jeg nevnte tidligere. Men hvorfor må det genereres fra samme kilde?
Sitat av ticks Vis innlegg
Hvorfor ikke legge den bildegenererende delen av scriptet i en egen fil? Det eneste fila da gjør er å lage bildet, og returnere det.
Vis hele sitatet...
Fordi jeg, som jeg kanskje ikke har spesifisert klart nok, trenger variabler spesifisert i PHP-filen i opprettelsen av bildet. Derfor må altså koden som generer bildet, ligge i nettopp PHP-filen.
Lite kontroversiell
ticks's Avatar
Hva med å sende variablene med GET..?

bildegenerator.php?var1=foo&var2=bar
Sist endret av ticks; 7. august 2010 kl. 01:54.
Sitat av ticks Vis innlegg
Hva med å sende variablene med GET..?

bildegenerator.php?var1=foo&var2=bar
Vis hele sitatet...
Flott! Akkurat en slik løsning jeg var ute etter.

Forøvrig trenger jeg en løsning på mitt andre problem: Kan jeg gjøre noe med det faktum at genererte bilder ikke ser ut til å la seg lagre?
Lite kontroversiell
ticks's Avatar
Bruk følgende:

header("Content-Disposition: attachment; filename=bilde.png");
z0p
uʍop ǝpısdn
z0p's Avatar
Sitat av Kyrios Vis innlegg
Fordi jeg, som jeg kanskje ikke har spesifisert klart nok, trenger variabler spesifisert i PHP-filen i opprettelsen av bildet. Derfor må altså koden som generer bildet, ligge i nettopp PHP-filen.
Vis hele sitatet...
Poenget er jo at at andre kan gi deg en god løsning på et mer generelt problem enn på et problem du har snevret deg inn på selv, og som sannsynligvis er en dårlig innfallsvinkel å løse det på. Av og til hjelper det å revurdere problemstillingen..

Just for fun: Siden jeg uansett har lite å finne på lagde jeg et eksempel av koden din med data uri om noe skulle ha interesse av den

Kode

<?php
ob_start();

$my_img = imagecreate( 200, 80 );

$background = imagecolorallocate( $my_img, 0, 0, 255 );
$text_colour = imagecolorallocate( $my_img, 255, 255, 0 );
$line_colour = imagecolorallocate( $my_img, 128, 255, 0 );

imagestring( $my_img, 4, 30, 25, "Generated image", $text_colour );
imagesetthickness ( $my_img, 5 );
imageline( $my_img, 30, 45, 165, 45, $line_colour );

imagepng( $my_img );
imagedestroy( $my_img );

$enc_img = base64_encode( ob_get_contents() );
ob_end_clean();

echo '
<html>
  <head>
    <title>image</title>
  </head>
  <body>
    <img src="data:image/png;base64,'.$enc_img.'" alt="base64 encoded image" />
  </body>
</html>'
?>
http://prosjektet.net/nff/img.php

Sitat av z0p Vis innlegg
Poenget er jo at at andre kan gi deg en god løsning på et mer generelt problem enn på et problem du har snevret deg inn på selv, og som sannsynligvis er en dårlig innfallsvinkel å løse det på. Av og til hjelper det å revurdere problemstillingen..

Just for fun: Siden jeg uansett har lite å finne på lagde jeg et eksempel av koden din med data uri om noe skulle ha interesse av den

Kode

<?php
ob_start();

$my_img = imagecreate( 200, 80 );

$background = imagecolorallocate( $my_img, 0, 0, 255 );
$text_colour = imagecolorallocate( $my_img, 255, 255, 0 );
$line_colour = imagecolorallocate( $my_img, 128, 255, 0 );

imagestring( $my_img, 4, 30, 25, "Generated image", $text_colour );
imagesetthickness ( $my_img, 5 );
imageline( $my_img, 30, 45, 165, 45, $line_colour );

imagepng( $my_img );
imagedestroy( $my_img );

$enc_img = base64_encode( ob_get_contents() );
ob_end_clean();

echo '
<html>
  <head>
    <title>image</title>
  </head>
  <body>
    <img src="data:image/png;base64,'.$enc_img.'" alt="base64 encoded image" />
  </body>
</html>'
?>
http://prosjektet.net/nff/img.php
Vis hele sitatet...
BTW, det er overflødig whitespace i header som er problemet i din orginale kode kode
Fantastisk kode z0p, veldig praktisk, og nå lar visst bildet seg lagre også. En siste ting: Alle bildene som genereres med koden din, får navnet "untitled" når man lagrer det. Er det mulig å velge navn selv?
Sist endret av Kyrios; 7. august 2010 kl. 14:58.
z0p
uʍop ǝpısdn
z0p's Avatar
Ikke såvidt jeg vet. Ihvertfall ikke direkte i følge:
RFK2397 - The "data" URL scheme

Så lenge man ikke sender

Kode

"Content-Disposition: attachment; filename=filename.ext"
i header blir det browser-spesifikt hvor de får filnavnet fra, om det muligens kan være et av attributtene eller et parameter i URI

Du kan selvfølgelig også genrere bildet og markup i samme fil med løsningene som er nevnt tidligere dersom du bruker litt logikk, og ikke gjør det på en og samme gang. F.eks

Kode

<?php

if (!Empty( $_GET['img'] ) ): create_image();
else: parse_page();
endif;

function create_image() {
    header("Content-type: image/png");
    header("Content-Disposition: attachment; filename=bilde.png");
    
    $img_txt = ( isset( $_GET['txt'] ) ) ? $_GET['txt'] : 'dummy text';
    
    $my_img = imagecreate( 200, 80 ); 

    $background = imagecolorallocate( $my_img, 0, 0, 255 ); 
    $text_colour = imagecolorallocate( $my_img, 255, 255, 0 ); 
    $line_colour = imagecolorallocate( $my_img, 128, 255, 0 ); 

    imagestring( $my_img, 4, 30, 25, $img_txt, $text_colour ); 
    imagesetthickness ( $my_img, 5 ); 
    imageline( $my_img, 30, 45, 165, 45, $line_colour ); 

    imagepng( $my_img ); 
    imagedestroy( $my_img ); 
}

function parse_page() {
   echo ' 
    <html> 
      <head> 
        <title>image</title> 
      </head> 
      <body> 
        <img src="'.$_SERVER['PHP_SELF'].'?img=true&txt=bildetekst" alt="bilde fra php" /> 
      </body> 
    </html>';
}
?>
Test scriptet her

Dog er dette i utgangspunktet det samme som å ha dette i to script