Aktiver Bilderrahmen mit der DS...

Status
Für weitere Antworten geschlossen.

anjoho

Benutzer
Mitglied seit
05. Jan 2010
Beiträge
366
Punkte für Reaktionen
0
Punkte
22
Habe mal die GDLib rangezogen und die Ausgabe des Wetters in ein PNG umgeleitet.

Wie funktioniert das eigentlich? :confused:
Läuft dann später bei jedem User ein Programm, welches die Daten in ein PNG umwandelt oder ist das Bild selber in der Lage, sich die Daten aus der DB / Textdatei zu holen ?

Oder funktioniert das auch mittels php-Script? Habe mich bisher noch nie damit beschäftigt ...
 

Steini

Benutzer
Mitglied seit
22. Mrz 2010
Beiträge
423
Punkte für Reaktionen
1
Punkte
0
*lol* Okay, falls du doch noch Fragen hast, immer her damit... Gilt natürlich auch für alle anderen... :)
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ich habe mir mal ne kleine gif-Ausgabe für das aktuelle Wetter eines Ortes gemacht. Einfach mal F5 drücken ;)
weather_img.gif

Leider scheint php auf der DS Probleme mit UTF-8 kodierten Zeichen zu haben. Resp die gdlib stellt bestimmte Sonderzeichen ziemlich strange dar (sobaldTrondheim, Sør-Trøndelag kommt fliegt die gdlib auf die Schnauze). Gibt wahrscheinlich noch etliche mehr die Probleme bereiten werden

Gruss

tobi
 

nicknick

Benutzer
Mitglied seit
06. Mrz 2009
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
Du kannst doch bei meinem Code mehrere GET loc Parameter angeben. Soviele du willst resp soviele Zeichen wie via URL erlaubt sind (afaik 2048).
Ist zudem für einen "Anfänger" imho einfacher, als eine Textdatei auf der DS zu bearbeiten. Die fixen Städte kannst du ja im Array hinterlegen und der User kann immer noch über GET bestimmen was er sehen will

Da dachte ich jetzt eigentlich, dass die Städte über ein Plugin im DS-Manager eingestellt werden können ;)

Beim Get-Code is vielleicht zu beachten, dass die Bilderrahmen wahrscheinlich keine Sonderzeichen (Parameter nach der Datei-Endung) verarbeiten können. Mit dem Textfile ist das schon besser, denke ich.
Einfacher Dateiname + gängiges Bildformat wird wohl am sinnvollsten sein. (wie http://tobisworld.homeip.net/wetter/weather_img.gif :D )

Will jemand mit imap herumspielen? Ist nur quick&dirty, mit von irgendwo kopiert, es gibt da wunderbare Funktionen, wie nur ungelesene Mails anzeigen etc. leider hab ich im Moment nicht viel Zeit, das auszubauen (ist ja jetzt schon wieder nach 12 :eek: )

PHP:
$imap = imap_open("{IMAPSERVER:143}INBOX", "BENUTZERNAME", "KENNWORT");

if( $imap ) {
  
  //Check no.of.msgs
  echo $num = imap_num_msg($imap);
   
  $headers = @imap_headers($imap) ;  
  $numEmails = sizeof($headers);

  echo "You have $numEmails in your mailbox";

  for($i = 1; $i < $numEmails+1; $i++)

  {
    $mailHeader = @imap_headerinfo($imap, $i);
    $from = $mailHeader->fromaddress;
    $subject = strip_tags($mailHeader->subject);
    $date = $mailHeader->date;
    echo "<br>Email from $from<br> subject $subject<br> date $date<br>";
  }  
  //close the stream
  imap_close($imap);
}

@jahlives, hast du das PHP-script einfach nur in gif umbenannt, oder parst dein Server das gif als PHP? wegen der Sonderzeichen, vielleicht PHP auf utf-8 umstellen?
PHP:
mb_internal_encoding('UTF-8');
ach seh gerade, "bewölkt" is ja ein Ö drin, und wird korrekt angezeigt..
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Da dachte ich jetzt eigentlich, dass die Städte über ein Plugin im DS-Manager eingestellt werden können ;)
Niemand hindert dich daran das Array via DSM Plugin zu erstellen oder in einer DB oder Textfile zu speichern. Die Idee hat mich gereizt und drum habe ich das mal gemacht. Ich habe keinen digitalen Bilderrahmen, drum sind mir die GET Parameter ganz willkommen ;)

Beim Get-Code is vielleicht zu beachten, dass die Bilderrahmen wahrscheinlich keine Sonderzeichen (Parameter nach der Datei-Endung) verarbeiten können. Mit dem Textfile ist das schon besser, denke ich.
Einfacher Dateiname + gängiges Bildformat wird wohl am sinnvollsten sein. (wie http://tobisworld.homeip.net/wetter/weather_img.gif :D )
Mit Sonderzeichen scheint die gdlib ja eh Probleme zu haben. Norwegisch sieht echt ulkig aus. Mandarin habe ich noch nicht probiert

@jahlives, hast du das PHP-script einfach nur in gif umbenannt, oder parst dein Server das gif als PHP? wegen der Sonderzeichen, vielleicht PHP auf utf-8 umstellen?
PHP:
mb_internal_encoding('UTF-8');
ach seh gerade, "bewölkt" is ja ein Ö drin, und wird korrekt angezeigt..
Ich habe in dem Verzeichnis wo das "gif" liegt via htaccess einen PHP Handler für .gif hinzugefügt. Letztendlich ist das nur ein PHP Script das durch den Parser geht.
Ich habe echt alles ausprobiert, um das mit der Kodierung hinzukriegen. Die Ausgabe von PHP an den Browser als HTML funzt ja wunderbar. Dort wird auch Manadrin gut ausschauen ;)
Problematisch wird es erst wenn man solche Zeichen an die imagestring() Funktion übergibt. Dort scheint die gdlib nur ISO-8859-1 sinnvoll ausgeben zu können. Die PHP Core Funktionen haben keinerlei Prolbeme mit UTF-8, erst nach extern (gdlib) scheint es zu hacken.

Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Problematisch wird es erst wenn man solche Zeichen an die imagestring() Funktion übergibt. Dort scheint die gdlib nur ISO-8859-1 sinnvoll ausgeben zu können. Die PHP Core Funktionen haben keinerlei Prolbeme mit UTF-8, erst nach extern (gdlib) scheint es zu hacken.

Hast es mal mit imagefttext() probiert??

Itari
 

Steini

Benutzer
Mitglied seit
22. Mrz 2010
Beiträge
423
Punkte für Reaktionen
1
Punkte
0
Nach meinem gestrigen, bis tief in die Nacht dauernden Abtauchen in die Weiten der gdlib bin ich auf einige Restriktionen gestossen, die ich euch nicht vorenthalten möchte...

Ein Bilderrahmen stellt ein Bild mit fixer Größe dar, nehmen wir 640x480 Pixel. Anders als bei einer Website lässt es sich nun mal nicht unendlich scrollen (ist ja klar) und somit müssen die Informationen auf einer festen Größe Platz finden.

Das resultiert darin, dass...
  • wir nicht mit n Stationen für die Wetterdaten arbeiten können, sondern mit maximal drei, wenn man alle Infos zu einem Ort anzeigen möchte und
  • nicht Grafiken innerhalb des Bildes eingebettet werden können, es sei denn, wir beschränken uns auf eine einzige Station, da alles andere den fixen Rahmen sprengen und somit den frei verfügbaren Platz noch mehr limitieren würde
  • der zu wählende Font auch mit kleinen Werten noch angenehm zu lesen sein muss und wir uns hierob Gedanken machen sollten/müssen, ob wir
    1. lieber die Infos auch aus einiger Entfernung noch ablesen können/möchten oder
    2. wir den Rahmen desöfteren in die Hand nehmen, um die fitzelig kleinen Informationen noch erfassen zu können.
Bezüglich der Sonderzeichen-Problematik:
Ihr habt vergessen den Input zu maskieren. Meine Textdatei schaut so aus:

Code:
Dusseldorf|40217|Germany
Sør-Trøndelag||
Honolulu||
...und die Ausgabe erfolgt dann wie in der angehängten Grafik. Die Lösung lautet rawurlencode();

PHP:
simplexml_load_string(utf8_encode(file_get_contents('http://www.google.com/ig/api?weather='.rawurlencode($station).'&hl='.$sprache)));
 

Anhänge

  • google-wetter.php.png
    google-wetter.php.png
    7,6 KB · Aufrufe: 74

anjoho

Benutzer
Mitglied seit
05. Jan 2010
Beiträge
366
Punkte für Reaktionen
0
Punkte
22
Das resultiert darin, dass... wir nicht mit n Stationen für die Wetterdaten arbeiten können, sondern mit maximal drei, wenn man alle Infos zu einem Ort anzeigen möchte und nicht Grafiken innerhalb des Bildes eingebettet werden können,...

Ich denke, wir sollten die Ausgabe nur auf 1 Ort (meistens die eigene Location) beschränken. Dann bleibt der Kreativität noch etwas mehr Platz. :D

Wenn weitere Orte benötigt werden:

- entweder ein weiteres Bild im selben Verzeichnis ablegen, welches der Bilderrahmen nacheinander darstellt (Bilderrahmenabhängig)
- oder einen Ort nach dem anderen in einem definierten Intervall unter dem selben Dateinamen ablegen (php-abhängig)

ähnlich wie Tobi das hier gemacht hatte:

Ich würde eher die 2. Variante bevorzugen, da die Reihenfolge weiterer Bilder dann über PHP und somit vom User selber bestimmt werden kann.

Gruß Jochen
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@Steini
Es ist ja nicht die Usereingabe der Stadt, die falsch dargestellt würde. Google liefert bei gewissen Städten noch zusätzliche Angaben und diese haben Probleme mit den Sonderzeichen
Code:
[I]Trondheim, Sør-Trøndelag
[/I]Trondheim ist die Userangabe. Sor-Trondelag wird jedoch von Google geliefert. URLencoden könnte man höchstens die Userangabe nicht aber das Resultat von Google. Denn das Resultat kommt eh als UTF-8 resp wird für die XML Funktionen von PHP auf UTF-8 kodiert.
@itari
Deinen Vorschlag mit der Funktion werde ich mal noch probieren, habe aber irgendwie meine Zweifel, dass es wirklich hilft ;)
 

Steini

Benutzer
Mitglied seit
22. Mrz 2010
Beiträge
423
Punkte für Reaktionen
1
Punkte
0
[...] Google liefert bei gewissen Städten noch zusätzliche Angaben und diese haben Probleme mit den Sonderzeichen [...] Denn das Resultat kommt eh als UTF-8 resp wird für die XML Funktionen von PHP auf UTF-8 kodiert. [...]
Okay, in diesem Fall musst du bzw. müsst ihr folgendes Skelett verwenden, damit Sonderzeichen korrekt dargestellt und verarbeitet werden:

PHP:
<?php

// Pflichtangabe!
Header('Content-type: text/html; charset=utf-8');

// Hier die Codezeilen zur Generierung der Inhalte
// wie Textdatei auslesen, Output formatieren etc.

$file = file('./wetterstationen.dat');
$text = 'bla bla bla...';

// Ab hier erfolgt die Generierung des Bildes...
// Pflichtangabe!
Header('Content-type: image/png');

// Codezeilen zur Generierung des Bildes an dieser
// Stelle einfügen plus die Variable $text, welche
// die zuvor generierten Inhalte enthält

// imagefill();
// imagettftext();
// imagepng();
// imagedestroy();

?>

Trondheim wird mit diesem Skelett korrekt dargestellt:
 

Anhänge

  • google-wetter.php.png
    google-wetter.php.png
    8,1 KB · Aufrufe: 103

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
PHP:
<?php
// Pflichtangabe!
Header('Content-type: text/html; charset=utf-8');

// Hier die Codezeilen zur Generierung der Inhalte
// wie Textdatei auslesen, Output formatieren etc.

$file = file('./wetterstationen.dat');
$text = 'bla bla bla...';

// Ab hier erfolgt die Generierung des Bildes...
// Pflichtangabe!
Header('Content-type: image/png');

// Codezeilen zur Generierung des Bildes an dieser
// Stelle einfügen plus die Variable $text, welche
// die zuvor generierten Inhalte enthält

// imagefill();
// imagettftext();
// imagepng();
// imagedestroy();

?>
Trondheim wird mit diesem Skelett korrekt dargestellt:
Dieses Skelett ist aber nicht korrekt. Pro Dokument gibt es nur einen Content-type! Der zweite Content-type Header wird wohl von den meisten Browsern schlicht ignoriert werden
 

Steini

Benutzer
Mitglied seit
22. Mrz 2010
Beiträge
423
Punkte für Reaktionen
1
Punkte
0
Dieses Skelett ist aber nicht korrekt. Pro Dokument gibt es nur einen Content-type! Der zweite Content-type Header wird wohl von den meisten Browsern schlicht ignoriert werden
Wir reden hier nicht von einem Browser, sondern vom PHP-Parser, dessen Output dann im Browser dargestellt wird. Und das ist korrekt. Solange, wie nach einem Header keine Ausgabe erfolgt, kann man so viele Content-Typen oder wasauchimmer in ein Skript packen, wie man möchte. Das interessiert den Parser nicht. Und den Browser erst recht nicht, denn der stellt lediglich das fertige Produkt, in unserem Fall das Bild, dar.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Solange, wie nach einem Header keine Ausgabe erfolgt, kann man so viele Content-Typen oder wasauchimmer in ein Skript packen, wie man möchte. Das interessiert den Parser nicht. Und den Browser erst recht nicht, denn der stellt lediglich das fertige Produkt, in unserem Fall das Bild, dar.
Ich habe nicht behauptet, dass es nicht ginge, sondern dass es nach HTTP RFC garantiert nicht konform ist zweimal einen Content-type an den Client zu senden. Das macht ja auch rein logisch keinen Sinn, denn eine Ressource kann nur einen Typ haben, sonst wäre die Ressource schizophren ;)

PHP ist es so was von schnuppe was du via Header an den Client sendest. Ein PNG Bild kann doch keinen content-type text/html haben. Wenn der Browser so nett ist und darüber hinwegsieht, dann ist das seine Sache, aber es macht es dadurch nicht "korrekter" ;)

Gerade so "primitive" Dinge wie Bilderrahmen werden wohl weniger fehlertolerant sein als ein Browser. Kann also gut sein, dass nur die Bilderrahmen damit Probleme haben werden und die Browser dies trotz Fehler umsetzen.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@itari
Es war genau so wie du vermutet hast. Da imgestring() ein generisches Schriftfile verwendet kommen dort die Sonderzeichen nicht vor. Mit der von dir genannten Funktion und einem expliziten ttf File funzt es jedoch wunderprächtig. Danke für den Tip :)

weather_img.gif


Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
@itari
Es war genau so wie du vermutet hast. Da imgestring() ein generisches Schriftfile verwendet kommen dort die Sonderzeichen nicht vor. Mit der von dir genannten Funktion und einem expliziten ttf File funzt es jedoch wunderprächtig. Danke für den Tip :)

Bitte sehr ;)

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Hier mal mein Code als Source im zip
Ist wegen den enthaltenen ttf Schriften ziemlich gross ;)

Gruss

tobi
 

Anhänge

  • wetter.zip
    342 KB · Aufrufe: 8

nicknick

Benutzer
Mitglied seit
06. Mrz 2009
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
Super, habs mal ausprobiert und es funktioniert einwandfrei.
Habs für mich etwas modifiziert:
Um die Städte aus einem Textfile auszulesen (staedte.txt, in jeder Zeile ein Stadtname), die class.php ändern:
PHP:
$loc = array ('Trondheim', 'Narvik', 'Kiruna', 'Umea', 'Honningsvag' );
ersetzen durch
PHP:
function TrimArray($Input){
  if (!is_array($Input)) return trim($Input);
  return array_map('TrimArray', $Input);
}
 
$loc = TrimArray(file('staedte.txt'));

Wer statt Zufallswiedergabe nach der Reihe anzeigen lassen will:
weather_img.php:
PHP:
//ganz am Anfang
session_start();
Dann an der entsprechenden Stelle (ca. Zeile 22?) ersetzen durch:
PHP:
if (! isset ( $_GET ['loc'] )) {

	$max = count($loc)-1;
	// Wenn das der erste Aufruf ist, Zähler auf 0 (erstes Element im Array)
	if(!$_SESSION['last_loc']) $_SESSION['last_loc'] = 0;
	
  // Wenn am Ende angelangt, Zähler auf 0 
  if($_SESSION['last_loc'] > $max) $_SESSION['last_loc'] = 0;
  
  // nächstes Element anzeigen
  $_SESSION['last_loc'] = $_SESSION['last_loc'] + 1;
  
  $i = $_SESSION['last_loc']-1;
  $t = website_wetter ( $loc [$i] );
	
} else {

Ich hab in der .htaccess folgendes ausprobiert:

PHP:
Options +FollowSymlinks
RewriteEngine on
RewriteRule weather_img.gif weather_img.php
#AddType application/x-httpd-php .php .html .gif

funktioniert auch, ich kann aber nicht sagen, was jetzt nun serverkonformer ist ;)

Mein Bilderrahmen müsste gleich hier ankommen, dann probier ichs mal live aus
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Stimmt mit dem Rewrite ist es eigentlich besser, weil damit gezielt das gif festgelegt wird, welches "geparst" wird. Bei meiner Lösung werden ja alle gifs in dem Verzeichnis oder darunter durch den Parser gejagt. Werde das im htaccess File mal anpassen.
Ich habe den Code wiedermal etwas angepasst:
- jetzt ist class.php wirklich eine Klasse
- Sprache kann über GET lang überschrieben werden (z.Z. de und en)
- Übersetzungsarray für Ausgabe (z.Z. nur deutsch und englisch)
- die meisten Eigenschaften können als Eigenschaften des Objekts zur Laufzeit geändert werden

Für das Textfile mit dem Array könnte man den Konstruktor der Klasse anpassen
PHP:
public function __construct($sprache='de',$ttf='./ttf/latin.ttf',$base='http://www.google.com') {
 $this->ttf = $ttf;
 $this->icons_base = $base;
 $this->sprache = $sprache;
 if(isset($_GET['lang'])){
  switch($_GET['lang']){
   case 'de':
    $this->sprache = 'de';
   break;
   case 'en':
    $this->sprache = 'en';
   break;
   default:
    $this->sprache = 'de';
   }
  }
  $this->loc = file('staedte.txt'); 
}
Die Version auf dem Server (das zip File aus dem vorherigen Beitrag) habe ich mal aktualisiert.
 

anjoho

Benutzer
Mitglied seit
05. Jan 2010
Beiträge
366
Punkte für Reaktionen
0
Punkte
22
Habe heute bei wetter.com eine api-Schnittstelle gefunden.
Hat jedoch 3 Bedingungen: Anmeldung erforderlich, max. 10.000 Wetteranfragen je Monat und ich glaube in den AGB gelesen zu haben, dass die Wetterdaten nur 1x pro Tag aktualisiert werden.



Gruß Jochen
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat