[PHP] imagecopymerge-Problem

Alles Wissenswerte über Skripte, Browser, Makros, PhP, HTML...

Moderatoren: Moderatoren, Redakteure

Benutzeravatar
-pathfinder-
Beiträge: 1733
Registriert: 01.04.2007 20:46
Persönliche Nachricht:

[PHP] imagecopymerge-Problem

Beitrag von -pathfinder- »

Ich brauche da mal kurz Hilfe...
Habe mich zuvor so gut wie nie mit PHP beschäftigt, habe allerdings dieses Skript hier soweit basteln können, was auch funktioniert:

Code: Alles auswählen

<?php
									$frame = imagecreatefrompng('test2.png');
									$image = imagecreatefrompng('test.png');
								   
									imagealphablending($image, true);
									imagealphablending($frame, true);
									imagesavealpha($frame, true);
									imagesavealpha($image, true);
									
	imagecopymerge($image, $frame, 227, 45, 233, 22, 215, 65, 100);

	header('Content-Type: image/png');
								   imagepng($image, 'image.png');

								   imagepng($image);	
?>
Wichtig ist allerdings, dass in $frame = imagecreatefrompng('test2.png'); eine URL stehen sollte...Wenn ich das jetzt aber umändere, z.B. so:
$frame = imagecreatefrompng('http://www.example.com/image.png'); (nur Beispiel-URL, wird natürlich ersetzt), bekomme ich kein Bild mehr ausgegeben...Ich weiß, dass auf dem Server dieses Bild liegt, aber irgendwie gehts nicht...
Wohlgemerkt möchte ich auf ein Bild, was auf einem zweiten Server liegt, zugreifen (daher auch die Idee mit URL)...
Jetzt meine Frage: Was mache ich falsch bzw. was muss ich wie umändern, um ein Ergebnis zu bekommen?
Benutzeravatar
Sylence
Beiträge: 1154
Registriert: 10.07.2007 00:02
Persönliche Nachricht:

Beitrag von Sylence »

Gibts irgendwelche Fehlermeldungen?( error_reporting( E_ALL ); beim Entwickeln IMMER benutzen)

Ansonsten was steht denn unter "allow_url_fopen" in deiner php.ini ?
Und welche PHP version benutzt du ?
Benutzeravatar
träxx-
Beiträge: 11806
Registriert: 07.12.2006 12:38
Persönliche Nachricht:

Beitrag von träxx- »

Ich hab den Code mal mit 2 externen PNG's getested.
Funktioniert bei mir einwandfrei.

Bitte geh Sylences Idee mit allow_url_fopen nach, da wird sicherlich der Fehler liegen.
Benutzeravatar
Zappes
Beiträge: 2532
Registriert: 09.12.2008 23:15
Persönliche Nachricht:

Beitrag von Zappes »

Vermutlich läuft der PHP-Server im Safe-Mode - dann ist fopen auf URLs generell verboten.
Benutzeravatar
-pathfinder-
Beiträge: 1733
Registriert: 01.04.2007 20:46
Persönliche Nachricht:

Beitrag von -pathfinder- »

Also, ich habs nun mal auf meinem lokalen Server probiert und da gehts...
Auf meinem lokalen Server ist fopen auf on und safemode gibt es gar nicht in meiner php.ini...
Aber ich habe mal meinen Serverbetreiber angeschrieben und ihn gebeten, das für mich umzuändern..
Danke nochmal für eure Antworten, war sehr hilfreich :)
Benutzeravatar
-pathfinder-
Beiträge: 1733
Registriert: 01.04.2007 20:46
Persönliche Nachricht:

Beitrag von -pathfinder- »

Ich habe mal mit dem Support geredet und sie meinten, dass dort fopen off ist, weil es zu viele Sicherheitsrisiken beherbergt (die ändern das auch nicht)...
Jetzt ist meine Frage, ob es einen Workaround gibt...Ich habe nämlich keine Lust, die png-Datei von dem externen Server manuell auf meinen ersten Server hochzuladen, nur damit es funktioniert :(
btw: Der Betreiber meines Webspaces ist netroom...
Benutzeravatar
Zappes
Beiträge: 2532
Registriert: 09.12.2008 23:15
Persönliche Nachricht:

Beitrag von Zappes »

Falls die curl-Extension installiert ist, könntest Du das File mit curl holen und daraus das Bildobjekt bauen. Ob die Extension da ist, kannst Du einfach prüfen: Mach eine PHP-Datei, in der nur <?php phpinfo() ?> steht - das gibt die Konfiguration aus. Wenn da curl dabei ist, hast Du gute Karten. :)
Benutzeravatar
-pathfinder-
Beiträge: 1733
Registriert: 01.04.2007 20:46
Persönliche Nachricht:

Beitrag von -pathfinder- »

cURL-Support ist auf "enabled", allerdings kenne ich mich damit überhaupt nicht aus :(
Was muss ich jetzt wo ändern, damit ich ein Resultat erzielen kann?
Benutzeravatar
Zappes
Beiträge: 2532
Registriert: 09.12.2008 23:15
Persönliche Nachricht:

Beitrag von Zappes »

Schau mal hier rein:

http://www.dynamic-webpages.de/php/ref.curl.php

Wie Du schon im Beispiel auf der Seite siehst, kannst Du mit curl die Bilddateien holen und in temporäre Dateien speichern. Die sind dann lokal und damit kannst Du dann weiterarbeiten.
Benutzeravatar
-pathfinder-
Beiträge: 1733
Registriert: 01.04.2007 20:46
Persönliche Nachricht:

Beitrag von -pathfinder- »

Danke, ZappesBPD, für Deine bisherige Hilfe, hast mir sehr geholfen :)
Ich werde es nun schon schaffen, ist ja praktisch nur C&P^^
Benutzeravatar
träxx-
Beiträge: 11806
Registriert: 07.12.2006 12:38
Persönliche Nachricht:

Beitrag von träxx- »

Noch ein Tipp:

Solltest du weiteren Code nach der Bilderzeugung ausführen, wär ein imagedestroy() von Vorteil.
Das gibt den RAM für den nachfolgenden Code wieder frei.

Wenn nach imagepng($image); schluss ist, kannste darauf verzichten.
Benutzeravatar
-pathfinder-
Beiträge: 1733
Registriert: 01.04.2007 20:46
Persönliche Nachricht:

Beitrag von -pathfinder- »

J3kyll- hat geschrieben:Noch ein Tipp:

Solltest du weiteren Code nach der Bilderzeugung ausführen, wär ein imagedestroy() von Vorteil.
Das gibt den RAM für den nachfolgenden Code wieder frei.

Wenn nach imagepng($image); schluss ist, kannste darauf verzichten.
Danke für den Tipp, werde ich mir merken ;)
Benutzeravatar
-pathfinder-
Beiträge: 1733
Registriert: 01.04.2007 20:46
Persönliche Nachricht:

Beitrag von -pathfinder- »

Ich bin jetzt soweit fertig mit meinem Vorhaben, habe aber noch ein kleines Problem:
Ich habe eine Text-Datei in diesem Format:

Code: Alles auswählen

id;zahl\n
id;zahl\n
usw.
Jetzt habe ich folgendes vor: Ich möchte nach einer bestimmten id suchen und anschließend die Zahl, die in derselben Zeile wie die gesuchte id steht, mit einer anderen Zahl ersetzen...
Anschließend soll die Textdatei gespeichert werden...
Jetzt dachte ich daran, die Zeilen in Arrays zu laden und wenn Array[0]=Sucheintrag ist, soll Array[1] ersetzt werden...
ka, ob das zu rechenintensiv ist, evtl. gibts auch was Einfacheres (habe was von str_replace und strpos gelesen)...

Hab bis jetzt sowas hier, ist aber noch unvollständig:

Code: Alles auswählen

$datei_handle=fopen("update.txt",a);
	foreach( file( "update.txt" ) as $v ) { 
		$d = explode( ";", $v ); 
		if ($d[0] == 'id') {
		$d[1] = "Zahl ersetzen";}
	} 
Was mir noch fehlt, sind zwei Sachen:
Anschließend die Textdatei wieder speichern und eine Abfrage zwischenschalten: Wenn die id nicht existiert, soll sie in eine neue Zeile angelegt werden...
Nur, wie kann ich das realisieren?
Zoddy
Beiträge: 217
Registriert: 21.07.2009 12:49
Persönliche Nachricht:

Beitrag von Zoddy »

Code: Alles auswählen

$filename = 'update.txt';
$searchID = '25';
$newNumber = '8987';

file_put_contents( $filename, preg_replace(
	'!^' . $searchID . ';\d+$!m',
	$searchID . ';' . $newNumber,
	file_get_contents( $filename )
) );

das ist so das kürzeste, was mir eingefallen ist ;). ich weiß, da werden reguläre ausdrücke genutzt, die für die meisten schwer zu lesen sind, aber sie sind mächtig und schnell. und man tut immer gut daran, die syntax zu verstehen.

nur kurz zur erklärung: "file_put_contents" überschreibt den inhalt einer datei. "file_get_contents" liest den gesamten inhalt einer datei in einen string. dieser wird mithilfe des regulären ausdrucks (erster parameter von "preg_replace") durchsucht und wenn dieser passt dann durch den zweiten parameter von "preg_replace" ersetzt.

die drei variablen sind nur beispieldaten, die das ganze etwas übersichtlicher machen sollen. bei fragen einfach fragen ;)...
Benutzeravatar
-pathfinder-
Beiträge: 1733
Registriert: 01.04.2007 20:46
Persönliche Nachricht:

Beitrag von -pathfinder- »

Danke, das funktioniert soweit ganz gut, wenn ich statt \d \w verwende...
Habe aber noch zwei Fragen dazu:
Wie muss ich die Suche modifizieren, wenn meine Datei so aufgebaut ist:
id;zahl1;zahl2;zahl3

Wenn id vorhanden ist, sollen zahl 1-3 (immer alle drei) ersetzt werden...

Meine zweite Frage lautet, wie ich eine Abfrage einbauen kann, sodass, wenn id nicht gefunden wird, dieser (also id;zahl1;zahl2;zahl3) angelegt wird...