Image Datei in externer Webseite anzeigen

Ich hatte bisher Grafiken die mit Medienelementen verknüpft waren im Verzeichnis Media liegen. Wenn ich diese nun in einer Webseite die im user Verzeichnis lag anzeigen wollte habe ich auf diese Dateien verlinkt.

Mit IP Symcon 4 werden ja jetzt die Bilder der Medien im Arbeiterspeicher gehalten, liegen also bis zum Beenden nicht auf der Festplatte/SD Karte.

Wie schaffe ich es denn jetzt von einer Webseite die im user Verzeichnis liegt eine Grafik die in einem Media Element enthalten ist anzuzeigen? Hat da jemand ein Beispiel für mich?

php-Script im User Verzeichnis anlegen.
Dann mit IPS_GetMediaContent — IP-Symcon :: Automatisierungssoftware den Inhalt holen, decodieren und mit Echo ausgeben.
Michael

Das hatte ich schon ansatzweise probiert bisher aber ohne Erfolg.


$imageid = $_GET['imageid'];

$imageid = (int)$imageid;

if(!IPS_MediaExists($imageid))
    die("ID #".$imageid.") does not exists");

$media=IPS_GetMedia($imageid);

if($media['MediaType'] != 1)
    die("ID #".$imageid." is not an image");

$image = base64_decode(IPS_GetMediaContent($imageid));

echo $image;

Habe ich genommen und schicke da eine ObjektID hin. Die Seite gibt auch einen Text aus, findet also was, nur leider keine Grafik. Wahrscheinlich muss der Header noch richtig gesetzt werden nehme ich mal an. Nur wie bekomme ich raus anhand der base64 Daten um was es sich bei der Grafik genau handelt um den Header richtig zu setzten? Oder mache ich da sonst noch was falsch?

Stimmt da war was.
Gd2lib oder wie die von PHP da heißt kann dir den Typ ermitteln… Meine ich.
Dann den passenden Header senden und gut. Irgendwo hatte ich auch mal ein Beispiel, wenn ich es finde poste ich es heute abend.
Michael

Also wenn ich in dem Testfall


header("Content-Type : png");

ergänze bekomme ich auch ein Bild.


$imageid = $_GET['imageid'];

$imageid = (int)$imageid;

if(!IPS_MediaExists($imageid))
    die("ID #".$imageid.") does not exists");

$media=IPS_GetMedia($imageid);

if($media['MediaType'] != 1)
    die("ID #".$imageid." is not an image");

$image = base64_decode(IPS_GetMediaContent($imageid));

header("Content-Type : png");
echo $image;

Die Frage ist jetzt nur wie stelle ich Anhand der base64 ausgelesenen Daten fest welcher passende Header gesetzt werden muss?

Ich bin fündig geworden:


$imgbase64 = IPS_GetMediaContent($id); //liefert den Base64 kodierten Inhalt für das Medienobjekt
$imgdata = base64_decode($imgbase64);
  
$mimetype = getImageMimeType($imgdata);
echo $mimetype;

function getBytesFromHexString($hexdata)
{
  for($count = 0; $count < strlen($hexdata); $count+=2)
    $bytes[] = chr(hexdec(substr($hexdata, $count, 2)));

  return implode($bytes);
}

function getImageMimeType($imagedata)
{
  $imagemimetypes = array( 
    "jpeg" => "FFD8", 
    "png" => "89504E470D0A1A0A", 
    "gif" => "474946",
    "bmp" => "424D", 
    "tiff" => "4949",
    "tiff" => "4D4D"
  );

  foreach ($imagemimetypes as $mime => $hexbytes)
  {
    $bytes = getBytesFromHexString($hexbytes);
    if (substr($imagedata, 0, strlen($bytes)) == $bytes)
      return $mime;
  }

  return NULL;
}