| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

30-01-2009, 07:51
|
|
crussader
Registrierter Benutzer
|
|
Registriert seit: Jan 2009
Beiträge: 28
|
|
png problem
diese frage wurde sicher schon 1000mal gestellt
sorry aber hab hier nicht wirklich was gefunden
ich erzeuge ein png mit php das scheint auch zu klappen nur die anzeige des bildes ist binär
ich hab im header :
PHP-Code:
<meta http-equiv="content-type" content="image/png;"/>
aufrufen tu ich das bild mit :
PHP-Code:
print '($myimg)';
und erstellt wird es mit :
PHP-Code:
class gd_gradient_fill {
// Constructor. Creates, fills and returns an image
function gd_gradient_fill($w,$h,$d,$s,$e,$step=0) {
$this->width = $w;
$this->height = $h;
$this->direction = $d;
$this->startcolor = $s;
$this->endcolor = $e;
$this->step = intval(abs($step));
// Attempt to create a blank image in true colors, or a new palette based image if this fails
if (function_exists('imagecreatetruecolor')) {
$this->image = imagecreatetruecolor($this->width,$this->height);
} elseif (function_exists('imagecreate')) {
$this->image = imagecreate($this->width,$this->height);
} else {
die('Unable to create an image');
}
// Fill it
$this->fill($this->image,$this->direction,$this->startcolor,$this->endcolor);
// Show it
$this->display($this->image);
// Return it
return $this->image;
}
// Displays the image with a portable function that works with any file type
// depending on your server software configuration
function display ($im) {
if (function_exists("imagepng")) {
header("Content-type: image/png");
imagepng($im);
}
elseif (function_exists("imagegif")) {
header("Content-type: image/gif");
imagegif($im);
}
elseif (function_exists("imagejpeg")) {
header("Content-type: image/jpeg");
imagejpeg($im, "", 0.5);
}
elseif (function_exists("imagewbmp")) {
header("Content-type: image/vnd.wap.wbmp");
imagewbmp($im);
} else {
die("Doh ! No graphical functions on this server ?");
}
return true;
}
// The main function that draws the gradient
function fill($im,$direction,$start,$end) {
switch($direction) {
case 'horizontal':
$line_numbers = imagesx($im);
$line_width = imagesy($im);
list($r1,$g1,$b1) = $this->hex2rgb($start);
list($r2,$g2,$b2) = $this->hex2rgb($end);
break;
case 'vertical':
$line_numbers = imagesy($im);
$line_width = imagesx($im);
list($r1,$g1,$b1) = $this->hex2rgb($start);
list($r2,$g2,$b2) = $this->hex2rgb($end);
break;
case 'ellipse':
$width = imagesx($im);
$height = imagesy($im);
$rh=$height>$width?1:$width/$height;
$rw=$width>$height?1:$height/$width;
$line_numbers = min($width,$height);
$center_x = $width/2;
$center_y = $height/2;
list($r1,$g1,$b1) = $this->hex2rgb($end);
list($r2,$g2,$b2) = $this->hex2rgb($start);
imagefill($im, 0, 0, imagecolorallocate( $im, $r1, $g1, $b1 ));
break;
case 'ellipse2':
$width = imagesx($im);
$height = imagesy($im);
$rh=$height>$width?1:$width/$height;
$rw=$width>$height?1:$height/$width;
$line_numbers = sqrt(pow($width,2)+pow($height,2));
$center_x = $width/2;
$center_y = $height/2;
list($r1,$g1,$b1) = $this->hex2rgb($end);
list($r2,$g2,$b2) = $this->hex2rgb($start);
break;
case 'circle':
$width = imagesx($im);
$height = imagesy($im);
$line_numbers = sqrt(pow($width,2)+pow($height,2));
$center_x = $width/2;
$center_y = $height/2;
$rh = $rw = 1;
list($r1,$g1,$b1) = $this->hex2rgb($end);
list($r2,$g2,$b2) = $this->hex2rgb($start);
break;
case 'circle2':
$width = imagesx($im);
$height = imagesy($im);
$line_numbers = min($width,$height);
$center_x = $width/2;
$center_y = $height/2;
$rh = $rw = 1;
list($r1,$g1,$b1) = $this->hex2rgb($end);
list($r2,$g2,$b2) = $this->hex2rgb($start);
imagefill($im, 0, 0, imagecolorallocate( $im, $r1, $g1, $b1 ));
break;
case 'square':
case 'rectangle':
$width = imagesx($im);
$height = imagesy($im);
$line_numbers = max($width,$height)/2;
list($r1,$g1,$b1) = $this->hex2rgb($end);
list($r2,$g2,$b2) = $this->hex2rgb($start);
break;
case 'diamond':
list($r1,$g1,$b1) = $this->hex2rgb($end);
list($r2,$g2,$b2) = $this->hex2rgb($start);
$width = imagesx($im);
$height = imagesy($im);
$rh=$height>$width?1:$width/$height;
$rw=$width>$height?1:$height/$width;
$line_numbers = min($width,$height);
break;
default:
}
for ( $i = 0; $i < $line_numbers; $i=$i+1+$this->step ) {
// old values :
$old_r=$r;
$old_g=$g;
$old_b=$b;
// new values :
$r = ( $r2 - $r1 != 0 ) ? intval( $r1 + ( $r2 - $r1 ) * ( $i / $line_numbers ) ): $r1;
$g = ( $g2 - $g1 != 0 ) ? intval( $g1 + ( $g2 - $g1 ) * ( $i / $line_numbers ) ): $g1;
$b = ( $b2 - $b1 != 0 ) ? intval( $b1 + ( $b2 - $b1 ) * ( $i / $line_numbers ) ): $b1;
// if new values are really new ones, allocate a new color, otherwise reuse previous color.
// There's a "feature" in imagecolorallocate that makes this function
// always returns '-1' after 255 colors have been allocated in an image that was created with
// imagecreate (everything works fine with imagecreatetruecolor)
if ( "$old_r,$old_g,$old_b" != "$r,$g,$b")
$fill = imagecolorallocate( $im, $r, $g, $b );
switch($direction) {
case 'vertical':
imagefilledrectangle($im, 0, $i, $line_width, $i+$this->step, $fill);
break;
case 'horizontal':
imagefilledrectangle( $im, $i, 0, $i+$this->step, $line_width, $fill );
break;
case 'ellipse':
case 'ellipse2':
case 'circle':
case 'circle2':
imagefilledellipse ($im,$center_x, $center_y, ($line_numbers-$i)*$rh, ($line_numbers-$i)*$rw,$fill);
break;
case 'square':
case 'rectangle':
imagefilledrectangle ($im,$i*$width/$height,$i*$height/$width,$width-($i*$width/$height), $height-($i*$height/$width),$fill);
break;
case 'diamond':
imagefilledpolygon($im, array (
$width/2, $i*$rw-0.5*$height,
$i*$rh-0.5*$width, $height/2,
$width/2,1.5*$height-$i*$rw,
1.5*$width-$i*$rh, $height/2 ), 4, $fill);
break;
default:
}
}
}
// #ff00ff -> array(255,0,255) or #f0f -> array(255,0,255)
function hex2rgb($color) {
$color = str_replace('#','',$color);
$s = strlen($color) / 3;
$rgb[]=hexdec(str_repeat(substr($color,0,$s),2/$s));
$rgb[]=hexdec(str_repeat(substr($color,$s,$s),2/$s));
$rgb[]=hexdec(str_repeat(substr($color,2*$s,$s),2/$s));
return $rgb;
}
}
?>
|

30-01-2009, 11:38
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Dir ist aber schon klar, dass du Bild und Markup über ein img-Tag mit src-Attribut voneinander trennen musst*?
* Inline-Images werden ja leider nicht komplett unterstützt.
|

30-01-2009, 14:40
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Re: png problem
Zitat:
Original geschrieben von crussader
diese frage wurde sicher schon 1000mal gestellt
sorry aber hab hier nicht wirklich was gefunden/
|
Dazu muss man auch nichts "finden", sondern mal kurz logisch nachdenken.
Wie bindest du denn normalerweise ein Bild in ein HTML-Dokument ein, wenn PHP gar nicht im Spiel ist?
Kopierst du da etwa die binaeren Daten aus der Bilddatei in das HTML-Dokument hinein? Nein? Wie kommst du dann auf die Idee, dass das ploetzlich sinnvoll sein koennte, nur weil die Bilddaten nicht in einer statischen Datei vorliegen, sondern per PHP erzeugt werden?
Die Antwort lautet also: Binde das Bild ganz genau so ein, als ob es statisch waere. Ein Client interessiert sich ueberhaupt nicht dafuer, ob eine Ressource auf dem Server statisch aus einer Datei erstellt, dynamisch von PHP erzeugt, oder von deiner Oma gestrickt wird. Also mache bei der clientseitigen Einbindung auch keinerlei Unterschied.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

30-01-2009, 14:40
|
|
pekka
PHP Master
|
|
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
|
|
Die Content-Type-Angabe macht den darunterstehenden PNG-Code kaputt. Es muß heißen:
header("Content-type: image/png");
|

31-01-2009, 05:51
|
|
crussader
Registrierter Benutzer
|
|
Registriert seit: Jan 2009
Beiträge: 28
|
|
wenn ich das nun alles so richtig verstanden habe muss ich das bild mit
PHP-Code:
<?
require_once('gd-gradient-fill.php');
$myimg = new gd_gradient_fill(80,20,'diamond','#ff0010','#303060');
?>
<img src="<? echo'$myimg'?>">
einbinden ?
klappt nicht
hab als aufruf noch
PHP-Code:
<?
require_once('gd-gradient-fill.php');
$myimg = new gd_gradient_fill(80,20,'diamond','#ff0010','#303060');
?>
<? header("Content-type: image/png");?>
<body>
<? echo '<img src="'.$myimg.'">' ?>
</body>
versuch - ohne erfolg
es klappt nur wenn ich z.b. das bild vorher speicher
wie hier:
PHP-Code:
<?php
// Beispiel für ein simples Bild
header("Content-type: image/png"); // Mime-Type setzen
$im = imagecreate(155,155); // Erstellt ein rechteckiges
// Bild mit 155 Pixel Kantenlänge
$background_color = ImageColorAllocate ($im, 255, 255, 255);
// erste Farbe ist Hintergrundfarbe
$blue = imagecolorallocate($im, 0, 128, 255); // Blau
$red = imagecolorallocate($im, 255,0,0); // Rot
$yellow = imagecolorallocate($im, 255,255,0); // Gelb
// drei gefüllte Rechtecke
imagefilledrectangle ( $im, 5, 5, 100,100,$red);
imagefilledrectangle ( $im, 75, 75, 150,150,$blue);
imagefilledrectangle ( $im, 85, 20, 140,160,$yellow);
$speichern = '00'.'.png';
imagepng($im,$speichern); // Das Bild als PNG-Bild ausgeben
imagedestroy($im); // Alle Resourcen, die wegen des Bildes gehalten werden, freigeben.
echo '<img src="'.$speichern.'">'
?>
nur leider bekomm ich das in der anderen php nicht hin das das bild gespeichert wird.
hab in die funktion
display($im) versucht abzuändern :
PHP-Code:
function display ($im) {
if (function_exists("imagepng")) {
header("Content-type: image/png");
$speichern = 'test'.'.png';
imagepng($im,$speichern); // Das Bild als PNG-Bild ausgeben
imagedestroy($im); // Alle Resourcen, die wegen des Bildes gehalten werden, freigeben.
}
nur leider bleibt der bildschirm weiss
ich glaub mir fehlt die logic
Geändert von crussader (31-01-2009 um 05:58 Uhr)
|

31-01-2009, 07:07
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Na, dann guck mal was passiert, wenn du imagepng einen zweiten Parameter übergibst: http://de.php.net/imagepng
|

31-01-2009, 07:35
|
|
crussader
Registrierter Benutzer
|
|
Registriert seit: Jan 2009
Beiträge: 28
|
|
moinsen
nunja ich hab ja als 2. parameter $speichern übergeben - und in $speichern steht der dateiname : $speichern = '00'.'.png';
nur leider funktioniert das nur in dem beispiel mit den 3 rechtecken und in anderen beispielbildern.
wenn ich die gd_gradient_fill.php so abändere :
PHP-Code:
// depending on your server software configuration
function display ($im) {
if (function_exists("imagepng")) {
header("Content-type: image/png");
$speichern = 'test'.'.png';
imagepng($im,$speichern); // Das Bild als PNG-Bild ausgeben
imagedestroy($im); // Alle Resourcen, die wegen des Bildes gehalten werden, freigeben.
}
passiert nüx
|

31-01-2009, 07:42
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Was interessiert mich, was du als 2. Parameter übergibst? Ich habe dich auf was vollkommen anderes hingewiesen! Und dein Code ist identisch zu dem vorherigen.
|

31-01-2009, 08:04
|
|
crussader
Registrierter Benutzer
|
|
Registriert seit: Jan 2009
Beiträge: 28
|
|
also irgendwie verstehe ich dich nicht
erst sagst du :
und dann sag ich dir das der 2. parameter der dateiname ist .
jetzt sagst du :
Zitat:
|
unset Was interessiert mich, was du als 2. Parameter übergibst? Ich habe dich auf was vollkommen anderes hingewiesen! Und dein Code ist identisch zu dem vorherigen.
|
und als parameter finde ich hier :
$image
$filename
$quality
$filters
das bedeutet für mich
imagepng($image, $filename) damit ich die ausgabe von $image in eine datei schreiben kann - ist das so richtig ?
und wenn das passiert ist $imagedestroy($image) damit beim nächsten aufruf der seite das bild neu geladen werden kann
|

31-01-2009, 08:44
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Du sollst dem Link folgen und überprüfen, wie sich imagepng verhält, wenn du zusätzlich einen zweiten Parameter übergibst, dass in Beziehung zu deinem Problem setzen, dass das Bild nicht ausgegeben wird und dir so selbst helfen.
Verständlicher?
|

31-01-2009, 13:29
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Original geschrieben von crussader
wenn ich das nun alles so richtig verstanden habe muss ich das bild mit [...] einbinden ?
klappt nicht
hab als aufruf noch [...] versuch - ohne erfolg
|
Da hast du immer noch binaere Bilddaten und HTML-Code innerhalb ein und der selben Ressource an den Browser ausgeliefert - dabei wurdest du bereits darauf hingewiesen, dass du das doch auch nicht so machst, wenn du ein statisches Bild einbindest. Also warum nimmst du an, dass das bei einem dynamischen Bild irgendwie sinnvoll sein koennte?
Zitat:
|
es klappt nur wenn ich z.b. das bild vorher speicher
|
Dann mach dir klar, was daran der Unterschied zu obigem Vorgehen ist.
Na?
Richtig, damit hast du zwei voneinander unabhaengige Ressourcen, die der Browser einzeln anfordert - einmal das HTML-Dokument, in dem der Browser <img src="..."> findet, und daraufhin stellt er eine zweite Anforderung an den Server, mit der bei ... angegebenen Adresse, und fordert damit das Bild separat an.
Das "zum Beispiel" ist das wichtige in deiner obigen Aussage. Wenn du es erst speicherst, dann hast du letztendlich wieder ein statisches Bild, dass du anschliessend irgendwo einbinden kannst.
Du musst es aber natuerlich nicht speichern, du kannst das Script die Bilddaten auch dynamisch ausgeben lassen - aber bitte so, dass dies mit einem zweiten, von der HTML-Seite vollkommen unabhaengigen Request passiert.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

31-01-2009, 15:15
|
|
crussader
Registrierter Benutzer
|
|
Registriert seit: Jan 2009
Beiträge: 28
|
|
also ist mein problem nicht der code mit dem das bild erstellt wird sondern wie ich es aufrufe ?
gruss c.
|

31-01-2009, 15:33
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Ja (wenn wir "Aufrufen" zwecks etwas korrekterer Formulierung mal durch "Einbinden" ersetzen).
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

31-01-2009, 15:57
|
|
crussader
Registrierter Benutzer
|
|
Registriert seit: Jan 2009
Beiträge: 28
|
|
na da bin ich ja schonmal bissi schlauer
ich hab eine datei erstellt - bild.php
der inhalt :
PHP-Code:
<?
require_once('gd-gradient-fill.php');
$myimg = new gd_gradient_fill(80,20,'diamond','#ff0010','#303060');
//$img = new gd_gradient_fill(400,200,'ellipse','#f00','#000',0);
echo '<img src="'.$myimg.'">'
?>
so müsste das doch dann eigentlich richtig sein
|

31-01-2009, 16:01
|
|
crussader
Registrierter Benutzer
|
|
Registriert seit: Jan 2009
Beiträge: 28
|
|
okokok - hab das ; hinter dem aufruf vergessen
SCHANDE ÜBER MICH
aber nu geht das - komisch ich dachte das hätt ich schon so versucht
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|