Bild von externer Quelle laden, Format prüfen und ggf. konvertieren

Prengepower

Mitglied
Hallo!

Ich suche nach einem Script mit dem ich ein externes gelagertes Bild auf meinem Server speichern kann. Dabei soll geprüft werden ob es sich dabei um ein jpg handelt und falls das nicht der Fall ist, soll es dahin konvertiert werden.

Wie kann ich das machen?

Das speichern funktioniert schon.. Beim konvertieren mache ich mich noch schwer.. Und die Prüfung habe ich auch noch nicht O.o

PHP:
function getPicture($url){
		$title = strrchr($url,"/");
		
		ob_start();
		$fp = fopen($url, "rb");
		fpassthru($fp);
		fclose($fp);
		$file = ob_get_contents();
		ob_end_clean();
		$fp = fopen("C:/xampp/xampp/htdocs/radioplay/images/artists".$title, "wb+");
		fwrite($fp, $file);
		fclose($fp);
		
		return substr($title,1,strlen($title));
	}

Danke :)
 
Vielleicht könntest du, wenn du die GD Library installiert hast, prüfen, ob die Funktion imagecreatefromjpeg erfolgreich ist oder fehlschlägt:
PHP:
$image = @imagecreatefromjpeg("C:/xampp/xampp/htdocs/radioplay/images/artists".$title);
if ($image=="")
{
  /* Ungültig */
}
else
{
  /* Erfolgreich */
}

Ich habe mir mal deinen Code genauer angeschaut. Du gibst das Bild zuerst aus (per [phpf]fpassthru[/phpf]) und dann schreibst du den Inhalt vom Ausgabepuffer in eine Datei.
Du könntest es so umbauen, dass du zuerst prüfst, ob das Bild gültig ist und dann direkt in eine Datei schreibst:
PHP:
function getPicture($url){ 
        $title = strrchr($url,"/"); 
         
        $file_in = fopen($url, "rb"); 
        $file_content = "";
        while (!feof($file_in))
        {
          $file_content .= fread($file_in, 1024);
        } 
        fclose($file_in);
        $gdimage = @imagecreatefromstring($file_content);
        if ($gdimage=="")
        {
          /* FEHLER */
        } 
        else
        {
          imagedestroy($gdimage);
          $file_out = fopen("C:/xampp/xampp/htdocs/radioplay/images/artists".$title, "wb+");
          fwrite($file_out, $file_content);
          fclose($file_out);
        }         
        return substr($title,1,strlen($title)); 
    }
 
Okay dank dir schonmal, aber ich habe es ja dann trotzdem nicht hinbekommen, dass das Bild ggf. zu JPG konvertiert wird.. Das brauche ich aber..
 
Dazu kannst du [phpf]imagejpeg[/phpf] verwenden.
Hier der ganze Code:

PHP:
function getPicture($url)
{ 
  $title = strrchr($url,"/"); 
         
  $file_in = fopen($url, "rb"); 
  $file_content = "";
  while (!feof($file_in))
  {
    $file_content .= fread($file_in, 1024);
  } 
  fclose($file_in);
        
  $gdimage = @imagecreatefromstring($file_content);
        
  if ($gdimage=="")
  {
    /* FEHLER: Datei ist kein Bild oder Dateiformat nicht unterstützt! */
  } 
  else
  {
    if (!imagejpeg($gdimage, "C:/xampp/xampp/htdocs/radioplay/images/artists".$title, 100))
    {
      /* FEHLER: JPEG konnte nicht aus dem Bild erstellt werden/gespeichert werden! */
    }
    imagedestroy($gdimage);
  }         
  return substr($title,1,strlen($title)); 
}
(Ich habe als dritten Parameter 100 angegeben, damit kein Qualitätsverlust entsteht, siehe Doku.)
 
Zuletzt bearbeitet:
Danke ich werds mal probieren :)

Achso und wie könnte ich noch einbauen, dass es verkleinert wird, dabei aber die Proportionen beibehalten werden?
 
Zuletzt bearbeitet:
Dabei könnte dir [phpf]imagecopyresampled[/phpf] helfen, z.B. so:
PHP:
/* $gdimage ist bereits initialisiert! */

$original_width = imagex($gdimage);
$original_height = imagey($gdimage);
$scale = 0.2;

$smallimage = imagecreate($original_width*$scale, $original_height*$scale);
imagecopyresampled($smallimage, $gdimage, 0, 0, 0, 0, $original_width*$scale, $original_height*$scale);
 
Kommt drauf an was du genau willst.
Wenn du das Bild einmal original und einmal verkleinert haben willst, dann so:
PHP:
function getPicture($url)
{ 
  $title = strrchr($url,"/"); 
         
  $file_in = fopen($url, "rb"); 
  $file_content = "";
  while (!feof($file_in))
  {
    $file_content .= fread($file_in, 1024);
  } 
  fclose($file_in);
        
  $gdimage = @imagecreatefromstring($file_content);
        
  if ($gdimage=="")
  {
    /* FEHLER: Datei ist kein Bild oder Dateiformat nicht unterstützt! */
  } 
  else
  {
    if (!imagejpeg($gdimage, "C:/xampp/xampp/htdocs/radioplay/images/artists".$title, 100))
    {
      /* FEHLER: JPEG konnte nicht aus dem Bild erstellt werden/gespeichert werden! */
    }
    $original_width = imagex($gdimage);
    $original_height = imagey($gdimage);
    $scale = 0.2;
    $smallimage = imagecreate($original_width*$scale, $original_height*$scale);
    imagecopyresampled($smallimage, $gdimage, 0, 0, 0, 0, $original_width*$scale,    $original_height*$scale);
    if (!imagejpeg($smallimage, "C:/xampp/xampp/htdocs/radioplay/images/artists".$title."small", 100))
    {
      /* FEHLER: JPEG konnte nicht aus dem (verkleinertem!) Bild erstellt werden/gespeichert werden! */
    }

    imagedestroy($gdimage);
    imagedestroy($smallimage);
  }         
  return substr($title,1,strlen($title)); 
}

Übrigens verkleinerst du das Bild hier um 80% ($scale=0.2), wenn du eine bestimmte Höhe oder Breite willst, musst du anders vorgehen.
 
Könntest du bitte auch was selber machen?
Ich denke, dass ist doch nicht so schwer.

Ich will nochmals erwähnen, dass wenn jemand ein Bild mit 10.000x10.000 Pixel reinstellt, das verkleinerte Bild eine Größe von 2000x2000 hat.
Also wenn du den Code zum Avatare-Erstellen benutzt, ist es nicht so gut.

Hier der gleiche Code, nur ~5 Zeilen rausgeschnitten.
PHP:
function getPicture($url)
{ 
  $title = strrchr($url,"/"); 
         
  $file_in = fopen($url, "rb"); 
  $file_content = "";
  while (!feof($file_in))
  {
    $file_content .= fread($file_in, 1024);
  } 
  fclose($file_in);
        
  $gdimage = @imagecreatefromstring($file_content);
        
  if ($gdimage=="")
  {
    /* FEHLER: Datei ist kein Bild oder Dateiformat nicht unterstützt! */
  } 
  else
  {
    $original_width = imagex($gdimage);
    $original_height = imagey($gdimage);
    $scale = 0.2;
    $smallimage = imagecreate($original_width*$scale, $original_height*$scale);
    imagecopyresampled($smallimage, $gdimage, 0, 0, 0, 0, $original_width*$scale,    $original_height*$scale);
    if (!imagejpeg($smallimage, "C:/xampp/xampp/htdocs/radioplay/images/artists".$title, 100))
    {
      /* FEHLER: JPEG konnte nicht aus dem (verkleinertem!) Bild erstellt werden/gespeichert werden! */
    }
 
    imagedestroy($gdimage);
    imagedestroy($smallimage);
  }         
  return substr($title,1,strlen($title)); 
}
 
Zurück