Bildgröße verändern

labelstore24

Mitglied
Hallo Leute,

danke im Voraus für Eure Hilfe.

Zurzeit arbeite ich an einem Banner in dem verschiedene Informationen dynamisch per PHP geschrieben werden. Bei einem Problem hänge ich jedoch etwas und Weiß nicht weiter.

Ich möchte verschiedene Userbilder (Avatare) im Banner im Format 64x64 Pixel anzeigen lassen, jedoch sind nicht alle Avatare im Format 1:1 das heißt das viele Avatare einfach auf 64x64 Pixel geschrumpft werden.

hätte jemand eine Idee oder evtl sogar eine Lösung für mein Problem.

ganz lieben dank für Eure Hilfe. LG Martin

PS: hier der link zum Banner http://www.gamingteam.de/ts3/banner/banner.png
 
Das ist für mich aus dem Stegreif leider schwierig zu erklären, aber ich versuche es mal:

Du suchst wahrscheinlich einen Algorithmus, der den größtmöglichen Ausschnitt, der einem bestimmten Seitenverhältnis (in deinem Fall 1:1) entspricht, in einem Bild findet. Das Bild soll (an beiden Seiten der „zu langen“ Dimension) gleichmäßig auf diesen Ausschnitt zugeschnitten und anschließend auf die gewünschte Zielgröße gebracht werden.

Beispiel: Du hast eine Zielgröße von 64 * 64 px, was einem Seitenverhältnis von 1:1 entspricht. Das zu bearbeitende Bild ist 320 * 240 px groß.

Größter Ausschnitt des Bilds, der noch deinem Seitenverhältnis entspricht, ist also: 240 * 240 px.

Um das Bild passend zuzuschneiden, müssen links und rechts 40 px entfernt werden ((320-240)/2). Oder anders gesagt, du schneidest den Ausschnitt von (40, 0) bis (280-1, 240-1) zur weiteren Verarbeitung aus dem Bild heraus.

Der muss dann lediglich noch auf 64 * 64 px skaliert werden.

Die Antwort auf diese Frage half mir neulich dabei, das zu implementieren:

- http://stackoverflow.com/questions/6539086/calculating-largest-possible-rectangle

Mein Code ist nicht völlig sauber und „pixel perfect“, aber er funktioniert für mich bislang gut genug.

(Demo der Ausgabe: http://i.imgur.com/UrBQsT1.png)

PHP:
<?php

function f($image, $boxWidth, $boxHeight)
{
    $imageWidth = imagesx($image);
    $imageHeight = imagesy($image);

    $sfw = $imageWidth / $boxWidth;
    $sfh = $imageHeight / $boxHeight;

    if ($sfw < $sfh) {
        $tmpBoxWidth = $boxWidth * $sfw;
        $tmpBoxHeight = $boxHeight * $sfw;
    } else {
        $tmpBoxWidth = $boxWidth * $sfh;
        $tmpBoxHeight = $boxHeight * $sfh;
    }

    $dstim = imagecreatetruecolor($tmpBoxWidth, $tmpBoxHeight);

    if ($sfw < $sfh) {
        imagecopy($dstim, $image, 0, 0, 0, ($imageHeight - $tmpBoxHeight) / 2, $tmpBoxWidth, $tmpBoxHeight);
    } else {
        imagecopy($dstim, $image, 0, 0, ($imageWidth - $tmpBoxWidth) / 2, 0, $tmpBoxWidth, $tmpBoxHeight);
    }

    $dstim2 = imagecreatetruecolor($boxWidth, $boxHeight);

    imagecopyresampled($dstim2, $dstim, 0, 0, 0, 0, $boxWidth, $boxHeight, $tmpBoxWidth, $tmpBoxHeight);

    return $dstim2;
}

$display = function ($image) {
    ob_start();
    imagejpeg($image);
    $data = ob_get_clean();
    return sprintf(
        '<img src="data:image/jpeg;base64,%s">',
        base64_encode($data)
    );
};

$srcData = file_get_contents('http://i.imgur.com/JDRkSQL.jpg');

$src = imagecreatefromstring($srcData);

$dest = f($src, 64, 64);

?>

<h1>Original</h1>

<?=$display($src)?>

<h1>Zuschnitt</h1>

<?=$display($dest)?>
 
Zuletzt bearbeitet:
Hey ganz liueben Dank für deine Mühe und dein Angagement das du genau verstanden hast was ich meinte.
Ich versuche es morgen mal in mein Projekt zu implementieren. Evtl. kann ich dich ja noch einmal kurz dazu was fragen wen ich Probleme damit haben sollte.

Dir einen schönen Tag bis dann

LG Martin
 
Ich bekomme das geschnittene bild einfach nicht in ein anderes bild geschrieben bisher nutze ich dazu imagecopyresized($tsbanner, $avatar, 7, 42, 0, 0, 64, 64, 64, 64)
 
Die Zeile ist im Grunde richtig, auch wenn es auch ein…

imagecopy($tsbanner, $avatar, 7, 42, 0, 0, 64, 64);

…tut. Man kann ohne Kontext nicht sagen, wo dein Fehler liegt.

PHP:
<?php

function f($image, $boxWidth, $boxHeight)
{
    $imageWidth = imagesx($image);
    $imageHeight = imagesy($image);

    $sfw = $imageWidth / $boxWidth;
    $sfh = $imageHeight / $boxHeight;

    if ($sfw < $sfh) {
        $tmpBoxWidth = $boxWidth * $sfw;
        $tmpBoxHeight = $boxHeight * $sfw;
    } else {
        $tmpBoxWidth = $boxWidth * $sfh;
        $tmpBoxHeight = $boxHeight * $sfh;
    }

    $dstim = imagecreatetruecolor($tmpBoxWidth, $tmpBoxHeight);

    if ($sfw < $sfh) {
        imagecopy($dstim, $image, 0, 0, 0, ($imageHeight - $tmpBoxHeight) / 2, $tmpBoxWidth, $tmpBoxHeight);
    } else {
        imagecopy($dstim, $image, 0, 0, ($imageWidth - $tmpBoxWidth) / 2, 0, $tmpBoxWidth, $tmpBoxHeight);
    }

    $dstim2 = imagecreatetruecolor($boxWidth, $boxHeight);

    imagecopyresampled($dstim2, $dstim, 0, 0, 0, 0, $boxWidth, $boxHeight, $tmpBoxWidth, $tmpBoxHeight);

    return $dstim2;
}

$display = function ($image) {
    ob_start();
    imagejpeg($image);
    $data = ob_get_clean();
    return sprintf(
        '<img src="data:image/jpeg;base64,%s">',
        base64_encode($data)
    );
};

$avatarWidth = 64;
$avatarHeight = 64;

$avatarSourceData = file_get_contents('http://i.imgur.com/xxmdFUQ.png');
$avatarSourceImage = imagecreatefromstring($avatarSourceData);

$avatarImage = f($avatarSourceImage, $avatarWidth, $avatarHeight);

$backdropData = file_get_contents('http://www.gamingteam.de/ts3/banner/banner.png');
$backdropImage = imagecreatefromstring($backdropData);

$combinedImage = imagecreatefromstring($backdropData);
imagecopy($combinedImage, $avatarImage, 7, 42, 0, 0, $avatarWidth, $avatarHeight);

?>

<h1>Original</h1>

<?=$display($avatarSourceImage)?>

<h1>Zuschnitt</h1>

<?=$display($avatarImage)?>

<h1>Backdrop</h1>

<?=$display($backdropImage)?>

<h1>Combined</h1>

<?=$display($combinedImage)?>
 
sorry das hier ist meine Datei

PHP:
<?php
   $config = array();
   $config['ip'] = '178.77.66.123';   
  $config['queryport'] = '######';  
  $config['serverport'] = '9987';   
  $config['loginname'] = '#######';
  $config['loginpass'] = '#######';   
  $config['displayname'] = 'TS3-UserInfo-Bot';  
   
   require_once('libraries/TeamSpeak3/TeamSpeak3.php');
   TeamSpeak3::init();
   $ts3 = TeamSpeak3::factory("serverquery://".$config['loginname'].":".$config['loginpass']."@".$config['ip'].":".$config['queryport']."/?server_port=".$config['serverport']."&nickname=".urlencode($config['displayname'])."");

   $lastConnected = "";
   
  foreach ($ts3->clientList(array('client_type' => 0)) as $client) {
  if (!is_object($lastConnected)) {
  $lastConnected = $client;
  } else if ($client->client_lastconnected > $lastConnected->client_lastconnected) {
  $lastConnected = $client;
       
       $avatar = file_get_contents('img/'.$client->client_database_id);
       preg_match('/\A(?:(\xff\xd8\xff)|(GIF8[79]a)|(\x89PNG\x0d\x0a)|(BM)|(\x49\x49(\x2a\x00|\x00\x4a))|(FORM.{4}ILBM))/', $avatar, $matches);
       $type = array(
         1 => "image/jpeg",
         2 => "image/gif",
         3 => "image/png",
         4 => "image/x-windows-bmp",
         5 => "image/tiff",
         6 => "image/x-ilbm",
       );
       switch ($type[count($matches)-1])
       {
         case 'image/jpeg':
           $avatar = imagecreatefromjpeg('img/'.$client->client_database_id);
           break;
         case 'image/gif':
           $avatar = imagecreatefromgif('img/'.$client->client_database_id);
           break;
         case 'image/png':
           $avatar = imagecreatefrompng('img/'.$client->client_database_id);
           break;
         default:
           $default = true;
           $avatar = imagecreatefrompng('img/user.png');   //default Bild
       }
  }
  }
   
   $fontface7= "/var/www/vhosts/gamingteam.de/httpdocs/ts3/banner/font/arialbd.ttf";
   $fontsize7 = 10;
   $text7 = $lastConnected->client_nickname;
   $left7 = 7;
   $top7 = 120;
   
   $image = imagecreatefrompng("images/banner-layout3.png");
  $imagesize = getimagesize("images/banner-layout3.png");
   $blue = ImageColorAllocate($image, 0,156,255);
   $weiss = ImageColorAllocate($image, 255,255,255);

  imagettftext($image, $fontsize7, 0, $left7, $top7, $blue, $fontface7, $text7);
   
   header("content-type: image/png");
   
   // Bildpfad
   $bildpfad1 = "img/banner-layout3.png";
   // Speicher in Datei
   imagepng($image, $bildpfad1);   
   // Cache leeren
  imagedestroy($image);
   
   $tsbanner = imageCreateFromPNG("img/banner-layout3.png");

   imagecopyresized($tsbanner, $avatar, 7, 42, 0, 0, 64, 64, imagesx($avatar), imagesy($avatar));
     
   // Bildpfad
   $bildpfad2 = "/var/www/vhosts/gamingteam.de/httpdocs/ts3/banner/banner.png";

   // Speicher in Datei
   imagepng($tsbanner, $bildpfad2);
   // Cache leeren
   imagedestroy($tsbanner);
?>
 
PHP:
  $config = array();
   $config['ip'] = '178.77.66.123';
  $config['queryport'] = '######';
  $config['serverport'] = '9987';
  $config['loginname'] = '######';
  $config['loginpass'] = '######';
  $config['displayname'] = 'TS3-UserInfo-Bot';

   require_once('libraries/TeamSpeak3/TeamSpeak3.php');
   TeamSpeak3::init();
   $ts3 = TeamSpeak3::factory("serverquery://".$config['loginname'].":".$config['loginpass']."@".$config['ip'].":".$config['queryport']."/?server_port=".$config['serverport']."&nickname=".urlencode($config['displayname'])."");

   $lastConnected = "";

  foreach ($ts3->clientList(array('client_type' => 0)) as $client) {
  if (!is_object($lastConnected)) {
  $lastConnected = $client;
  } else if ($client->client_lastconnected > $lastConnected->client_lastconnected) {
  $lastConnected = $client;
   
       $avatar = file_get_contents('img/'.$client->client_database_id);
       preg_match('/\A(?:(\xff\xd8\xff)|(GIF8[79]a)|(\x89PNG\x0d\x0a)|(BM)|(\x49\x49(\x2a\x00|\x00\x4a))|(FORM.{4}ILBM))/', $avatar, $matches);
       $type = array(
         1 => "image/jpeg",
         2 => "image/gif",
         3 => "image/png",
         4 => "image/x-windows-bmp",
         5 => "image/tiff",
         6 => "image/x-ilbm",
       );
       switch ($type[count($matches)-1])
       {
         case 'image/jpeg':
           $avatar = imagecreatefromjpeg('img/'.$client->client_database_id);
           break;
         case 'image/gif':
           $avatar = imagecreatefromgif('img/'.$client->client_database_id);
           break;
         case 'image/png':
           $avatar = imagecreatefrompng('img/'.$client->client_database_id);
           break;
         default:
           $default = true;
           $avatar = imagecreatefrompng('img/user.png');   //default Bild
       }
  }
  }

   $fontface7= "/var/www/vhosts/gamingteam.de/httpdocs/ts3/banner/font/arialbd.ttf";
   $fontsize7 = 10;
   $text7 = $lastConnected->client_nickname;
   $left7 = 7;
   $top7 = 120;

   $image = imagecreatefrompng("images/banner-layout3.png");
  $imagesize = getimagesize("images/banner-layout3.png");
   $blue = ImageColorAllocate($image, 0,156,255);
   $weiss = ImageColorAllocate($image, 255,255,255);

  imagettftext($image, $fontsize7, 0, $left7, $top7, $blue, $fontface7, $text7);

   header("content-type: image/png");

   // Bildpfad
   $bildpfad1 = "img/banner-layout3.png";
   // Speicher in Datei
   imagepng($image, $bildpfad1);
   // Cache leeren
  imagedestroy($image);

   $tsbanner = imageCreateFromPNG("img/banner-layout3.png");

     function f($image, $boxWidth, $boxHeight)
     {
       $imageWidth = imagesx($image);
       $imageHeight = imagesy($image);
 
       $sfw = $imageWidth / $boxWidth;
       $sfh = $imageHeight / $boxHeight;
 
       if ($sfw < $sfh) {
         $tmpBoxWidth = $boxWidth * $sfw;
         $tmpBoxHeight = $boxHeight * $sfw;
       } else {
         $tmpBoxWidth = $boxWidth * $sfh;
         $tmpBoxHeight = $boxHeight * $sfh;
       }
 
       $dstim = imagecreatetruecolor($tmpBoxWidth, $tmpBoxHeight);
 
       if ($sfw < $sfh) {
         imagecopy($dstim, $image, 0, 0, 0, ($imageHeight - $tmpBoxHeight) / 2, $tmpBoxWidth, $tmpBoxHeight);
       } else {
         imagecopy($dstim, $image, 0, 0, ($imageWidth - $tmpBoxWidth) / 2, 0, $tmpBoxWidth, $tmpBoxHeight);
       }
 
       $dstim2 = imagecreatetruecolor($boxWidth, $boxHeight);
 
       imagecopyresampled($dstim2, $dstim, 0, 0, 0, 0, $boxWidth, $boxHeight, $tmpBoxWidth, $tmpBoxHeight);
 
       return $dstim2;
     }
 
     $display = function ($image) {
       ob_start();
       imagejpeg($image);
       $data = ob_get_clean();
       return sprintf(
         '<img src="data:image/jpeg;base64,%s">',
         base64_encode($data)
       );
     };
 
     $avatarWidth = 64;
     $avatarHeight = 64;
 
     $avatarSourceData = file_get_contents($avatar);
     $avatarSourceImage = imagecreatefromstring($avatarSourceData);
 
     $avatarImage = f($avatarSourceImage, $avatarWidth, $avatarHeight);
 
     $backdropData = file_get_contents('img/banner-layout3.png');
     $backdropImage = imagecreatefromstring($backdropData);
 
     $combinedImage = imagecreatefromstring($backdropData);

   imagecopy($combinedImage, $avatarImage, 7, 42, 0, 0, $avatarWidth, $avatarHeight);
 
   // Bildpfad
   $bildpfad2 = "/var/www/vhosts/gamingteam.de/httpdocs/ts3/banner/banner.png";

   // Speicher in Datei
   imagepng($tsbanner, $bildpfad2);
   // Cache leeren
   imagedestroy($tsbanner);



ich übergebe ihm ein Bild im $avatarSourceData = file_get_contents($avatar); jedoch kommt dort keins an.

in meiner Variable $avatar ist der Pfad und das bild drinn img/user.png
 
Zuletzt bearbeitet:
PHP:
     $avatarSourceData = file_get_contents($avatar);
     $avatarSourceImage = imagecreatefromstring($avatarSourceData);

müsste

PHP:
     $avatarSourceImage = $avatar;

heißen.
 
Okay danke hat funktioniert.
Nun noch eine abschließende Frage: benötige ich das "return $dstim2;" am Ende des codes noch ?
 
Zuletzt bearbeitet:
Zurück