Logo aufs Bild machen

und für imagemagick gibt es dann auch eine schöne php-extension, die das alles löst, magickwand for php oder so
 
habt ihr denn jetzt eine brauchbare Lösung gefunden :?: :mrgreen:

suche sowas auch, für meine Game-Site, um die Screenshots und Co mit einem Branding zu versehen

Das Logo aufs Bild zu bekommen ist das kleinste Problem. Die Frage ist was du willst... hier wird ja viel diskutiert. Und es gibt eigentlich nur 2 praktikabele Lösungen, entweder du fügst das Logo direkt beim Upload hinzu oder du speicherst die Bilder mehrmals. Hat beides vor und nachteile. Da aber Speicher nix mehr kostet und man meistens schon die Grundlagen zur Variante Zwei hat bietet die sich eigentlich gradezu an.

Prinzipieller Ansatz ist dabei eigentlich ganz einfach, du speicherst das orginal Bild in einem gesonderten Ordner und legst ein zweiten Ordner an den du zb cache nennst. Den Bilder gibst du in irgendeiner Form eine eindeutige Bezeichnung. (ich nehm jetzt einfach mal eine ID, dass kann auch Datenbankgestützt laufen, oder über normale Dateinamen) Mein Bilder leigen jetzt also in Form von

PHP:
bilder/0001.jpg
bilder/0002.jpg
...

vor. Jetzt schreibt man sich ein kleines PHP Script an die man die kennung des Bildes übergibt. Das Script schaut beim Aufruf nach ob dieses Bild schon im cache/ existiert, wenn ja "readfile(cache/bild.jpg)" und fertig. Ansonsten erzeugt das Script das neue Bild mit Wasserzeichen und speichert es im cache und gibt es aus. Das ist eigentlich schon das ganze prinzip...

In Code Form schaut das so aus:

PHP:
<?
$bild_id = (int)$_GET['bild_id'];

$pic = 'bilder/'.$bild_id.'.jpg'; 
$cache_pic = $bild_id.'.jpg'; 

if(!file_exists("cache/".$cache_pic)) {
	$temp = getimagesize($pic);
	$org_x = $temp[0];
	$org_y = $temp[1];
	
	$org_pic = imagecreatefromjpeg($pic);

	
	$new_image = $org_pic; //hier war ein resize drin, die varialben sollten für den produktiv einsatz ordentlich ersetzt werden, ansonsten doppelter speicherbedarf = faulheit
	
	//logo einfügen
		$logo_img = imagecreatefrompng('logo.png');
		imagealphablending($logo_img,true);

		$logo_size = array('width'=>30,'height'=>30);
			
		imagecopyresampled( $new_image,$logo_img, ($org_x-$logo_size['width'])>>1 , ($org_y-$logo_size['height'])>>1 ,0,0,$logo_size['width'],$logo_size['height'],86,86); 

	
	//bild speichern		
	$pic = "cache/".$cache_pic;
	imagejpeg($new_image,$pic,80);
} else {
   $pic = "cache/".$cache_pic;
}


header("Content-Type: image/jpeg");
readfile($pic);
?>

(der Code kann Fehler haben! Der hat grade 80% von seinen Zeilen verloren.)

Das ganze kann man jetzt noch ausbauen... zb könnte man eine Bildgröße übergeben. (was ich unteranderem grade mit entfernt habe) Dann ändern man einfach $cache_pic ab und packt die größe mit rein... (resizen natürlich nicht vergessen, passt gut an die stelle wo der dumme Kommentar steht) somit hat man auch gleich eine Thumbnail funktion mit Cache. (das meinte ich mit Grundlage, weil meistens hat man schon sowas in der Art)

PS: wie gesagt der Code ist stark abgespeckt... bei mir ist es Datenbank gestützt und hatte auch noch alternativ Bilder. Wenn man hier eine ID aufruft dies nicht gibt, gibts unschöne effekte.

PPS: das Script untersützt auch den Alphakanal in der logo.png. Sprich man kann schöne transparente Logs drauf setzen.

@theHacker praktikables beispiel für bitshifts... ;)
 
Zuletzt bearbeitet:
PHP:
<?
$bild_id = (int)$_GET['bild_id'];

$pic = 'bilder/'.$bild_id.'.jpg'; 
$cache_pic = $bild_id.'.jpg'; 

if(!file_exists("cache/".$cache_pic)) {
	$temp = getimagesize($pic);
	$org_x = $temp[0];
	$org_y = $temp[1];
	
	$org_pic = imagecreatefromjpeg($pic);

	
	$new_image = $org_pic; //hier war ein resize drin, die varialben sollten für den produktiv einsatz ordentlich ersetzt werden, ansonsten doppelter speicherbedarf = faulheit
	
	//logo einfügen
		$logo_img = imagecreatefrompng('logo.png');
		imagealphablending($logo_img,true);

		$logo_size = array('width'=>30,'height'=>30);
			
		imagecopyresampled( $new_image,$logo_img, ($org_x-$logo_size['width'])>>1 , ($org_y-$logo_size['height'])>>1 ,0,0,$logo_size['width'],$logo_size['height'],86,86); 

	
	//bild speichern		
	$pic = "cache/".$cache_pic;
	imagejpeg($new_image,$pic,80);
} else {
   $pic = "cache/".$cache_pic;
}


header("Content-Type: image/jpeg");
readfile($pic);
?>

(der Code kann Fehler haben! Der hat grade 80% von seinen Zeilen verloren.)


PHP:
header("Content-Type: image/jpeg");

wird für deinen Zweck nicht benötigt, und wenn du das Bild doch ausgeben willst, dann hat header() als erstes zu stehen, weil der Header einer Datei zuerst gesendet werden muss, vor jeglicher Ausgabe. Sollte dein Code unter einem Fehler stoppen gibt bzw. könnte sich daraus eine Ausgabe vor dem Header ergeben, je nach dem wie PHP konfiguriert ist.
 
PHP:
header("Content-Type: image/jpeg");

wird für deinen Zweck nicht benötigt, und wenn du das Bild doch ausgeben willst, dann hat header() als erstes zu stehen, weil der Header einer Datei zuerst gesendet werden muss, vor jeglicher Ausgabe. Sollte dein Code unter einem Fehler stoppen gibt bzw. könnte sich daraus eine Ausgabe vor dem Header ergeben, je nach dem wie PHP konfiguriert ist.

Ok... Preis frage, welcher oder welche Browser haben damit "Probleme" wenn ein Bild als html/text übermittelt wird. Kreuzen sie an:
PHP:
[ ] Internet Explorer
[ ] Firefox
[ ] Opera
[ ] Safari

Warum ich den header am ende Positioniere? Das hat was mit organisation des Programmcodes zu tun. Hierbei handelt es sich ganz einfach um einen Trennung von der Programmlogik und der Ausgabelogik auch wenn die hier nur 2 Zeilen lang ist. Und es gibt auch kein handfesten Grund den Header oben hinzusetzen, ob jetzt nun ein Fehler auftritt und danach noch ein Fehler mit header already send, oder ob ich dem Browser sage das ein Bild kommt, aber dafür anstatt ein Bild ein "<b>Warning</b> blabla on Line so und so" sende kommt im Endeffekt aufs selbe hinaus. Das Bild wird nicht angezeigt! Variante hat aber noch den Vorteil dass wenn man das Bild direkt aufruft den Fehler in jedem Browser lesen kann.

PS: es ist eindeutig das falsche Gebiet, ich hab schon vor Jahren aufgehört zu sagen ich bin gut in PHP.
 
Zuletzt bearbeitet:
Nun klar wird er sich nicht gleich PHP umarbeiten um ein paar Bilder zu branden. Bzw ob er überhaupt die Befugnis dazu hat, ist auch so eine Sache.

öhm, er hat zu keinem zeitpunkt gesagt, dass er nicht die befugnisse hat (selbst wenn es so ist), also warum gleich alles verwerfen, was andere nennen? nene, das führt doch zu nix.
 
PHP Manual header().


Nur ein kleines Beispiel:
Code:
ErrorDocument 404 /images/nichtmehrvorhanden.php

/images/nichtmehrvorhanden.php:
PHP:
header("HTTP/1.0 200 OK");
header("Content-Type: image/jpeg");

// Code....
(Beispiel von Manual)


Aber warum haust du den Header nicht raus? Soweit gelesen, sollen die Bilder ja nur gebrandet und abgespeichert werden. Der Header ist nur für die Ausgabe der Bilder notwendig.