ugrás a tartalomhoz

Kép kiírás

CzP · 2017. Ápr. 19. (Sze), 17.55
Egy kezdő kér segítséget:
  1. <?php  
  2. $img = imagecreatefromjpeg ("xxx.jpg");  
  3. header ('Content-Type: image/jpeg');  
  4. imagejpeg($img);  
  5. imagedestroy($img);  
  6. ?>  
Erre a Firefox azt mondja hogy hibás a kép.
Mi a hiba ?

Köszönettel
 
1

Tobbi bongeszo?

janoszen · 2017. Ápr. 20. (Cs), 06.35
Mit mond a tobbi bongeszo? Ezer oka lehet, pl az hogy a file elejen vannak lathatatan BOM karaketerek (ha Notepad-del szerkesztesz pl.) vagy a file vegen benne hagytal par sortorest.

Ajanlom figyelmedbe Hidvegi kollega irasat.
2

Köszi a finom utalást hogy a

CzP · 2017. Ápr. 20. (Cs), 12.51
Köszi a finom utalást hogy a kezdők ne ezen a fórumon kérjenek segítséget, kutakodjanak inkább a dokumentációkban.
Amúgy a python PIL modulja segítségével rajzolom meg a képet amivel gond van.
Üdv: Czp
4

Nincs ott utalás

Pepita · 2017. Ápr. 20. (Cs), 18.45
Köszi a finom utalást hogy a kezdők ne ezen a fórumon kérjenek segítséget
Én nem látok ott erre vonatkozó utalást, és azt hiszem nem egyedül gondolom úgy, hogy Janoszen az egyik legjobb fej mentor.

Kicsit bővebben:
- Ha több más böngészőnek is rossz, akkor nem böngésző bug / feature.
- Amit írt, hogy BOM meg Notepad, az az idézett php kódra vonatkozik.
- Mindenképp hasznos cikk számodra, amit linkelt - feltéve ha hibakeresésben is akarsz fejlődni.

Plusz infó:
- Nem releváns, mivel hoztad létre a képet, viszont
- Érdemes kipróbálni úgy, hogy feltöltöd public könyvtárba, és URL-ből éred el, php nélkül. Ha így is "rossz", akkor a fájl hibás, de ez nem zárja ki a Janoszen által írt esetleges php hibákat.
3

Nem

janoszen · 2017. Ápr. 20. (Cs), 18.45
Nem errol van szo, de kb nulla infoval nehez segiteni. Toltsd fel a forraskepet es a filet valahova es linkeld be, akkor meg tudjuk nezni. Ezen felul a bongeszo debug eszkozei is sokat mondanak, pl. hogy nulla byte-os a kimeneti kep vagy van-e benne adat.
5

Csak a firefox mond erre

pp · 2017. Ápr. 21. (P), 09.17
Csak a firefox mond erre hibát? Vagy egyik böngészőben se jelenik meg?
curl -OL <url>
letölti rendesen? ugyan az a fájl lesz méretben, tartalomban?

pp
6

Kép feltöltés

CzP · 2017. Ápr. 21. (P), 21.31
Igazatok van, elnézést.
Az Opera sem jeleníti meg a képet, ha benn van a kódban a fenti kódrészlet, akkor egy üres lap jelenik meg. A Firefox pedig azt mondja hogy hibás a kép és nem tudja megjeleníteni. A web developer-t telepítettem mint debug eszközt, azonban ez nem a hibás képről hanem a hibakiírás képéről ad infót.

Amit csinálni szeretnék:
Hőmérsékleteket mérek és az eredményt az adott berendezés képfájljába + Sqlite -ba beírom -ez egy python script ami jól működik, aktualizálja a képeket.
Ezeket a képeket szeretném első lépésként egy oldalon megjeleníteni úgy hogy mutassák az aktuális állapotot. Amikor új rekord van az adatbázisban akkor kellene a megfelelő képet kirakni az oldalra.

Az oldal kódja így néz ki - ha kiveszem az ominózus kódrészt akkor szépen működik:
  1. <!doctype html>  
  2. <html lang="hu">  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <title>Rendszervezérlő</title>  
  6.         <style type="text/css" media="screen"></style>  
  7.     </head>  
  8.     <body>  
  9.         <img src="fejlec_1.jpg">  
  10.         <div>  
  11.             <a href="/almappa_1/beallitasok.html"><button type="button">BEÁLLÍTÁSOK</button></a>  
  12.             <a href="/almappa_1/statisztikak.php"><button type="button">STATISZTIKÁK</button></a>  
  13.             <a href="almappa_2/install.html"><button type="button">INSTALLÁCIÓ</button></a>  
  14.             <a href="/almappa_2/communication.html"><button type="button">KOMMUNIKÁCIÓ</button></a>  
  15.             <a href="index.html"><button type="button">KILÉPÉS</button></a>  
  16.         </div>  
  17.         <?php  
  18.         ini_set ('display_errors', 'On');  
  19.         error_reporting (E_ALL | E_STRICT);  
  20.   
  21.         $kepek = ["boyler.jpg","puffer.jpg"];  
  22.         $previous_row = 0;  
  23.           
  24.         try {$file_db = new PDO("sqlite:homerseklet.db"); }   
  25.         catch (PDOException $e) { die ($e->getMessage()); }  
  26.         $sql = 'SELECT * FROM adatok ORDER BY nr DESC';  
  27.         $result = $file_db->query ($sql);  
  28.         $rowarray = $result->fetchall(PDO::FETCH_ASSOC);  
  29.         if ($rowarray[0]['nr'] != $previous_row) { $previous_row = $rowarray[0]['nr'];   
  30.             $kepnr = $rowarray[0]['n'];  
  31.             $kep = $kepek[$kepnr];  
  32.               
  33.             header ('Content-Type: image/jpeg');      
  34.             $img = imagecreatefromjpeg($kep);  
  35.             imagejpeg($img);  
  36.             imagedestroy($img); }  
  37.         else { }  
  38.         ?>  
  39.     </body>  
  40. </html>  
A forrás xxx.jpg biztosan jó, mert HTML -ben direkt kiküldve <img src = "xxx.jpg"> jól megjelenik.
Mindenki egy könyvtárban lakik.

Üdv: Czp
7

Ahaaa'

janoszen · 2017. Ápr. 21. (P), 22.07
Na látod, így már mindjárt más a leányzó fekvése. A probléma ott van, hogy a Te kimenetedben keveredik a HTML és a bináris kép adat. (Vagyis beleírod a HTML forrásba a kép adatokat, amivel a böngésző nem tud mit kezdeni.)

Namost ezt három féle képpen lehet orvosolni:

1. Külön fájlba rakod a kép gyártását mint a HTML forrást.
2. data uri-val töltöd be a képet
3. JPG helyett SVG képet gyártasz és ezt közvetlenül beágyazhatod a HTML forrásba.

A 2. pont megoldása kb így nézne ki:
  1. <img src="data:image/jpeg;base64,<?php  
  2. //Kimenet elkapás megkezdése  
  3. ob_start();  
  4.   
  5. //Kép kiírás a fentieknek megfelelően  
  6. $img = imagecreatefromjpeg($kep);  
  7. imagejpeg($img);  
  8. imagedestroy($img);  
  9.   
  10. //Kimenet megszerzése  
  11. $imgData = ob_get_contents();  
  12.   
  13. // Kimenet törlése  
  14. ob_end_clean();  
  15.   
  16. // Tartalom kódolása és kiírása  
  17. echo(base64_encode($imgData));  
  18. ?>/>  
Ez gyakorlatilag annyit csinál, hogy "elkapja" a kimentet mielőtt kimenne a böngészőnek és base64 kódolja. Így a böngésző a data:image/jpeg;base64, címelőtéttel együtt már tud vele mit kezdeni.

Viszont, ha jól látom semmit nem csinálsz a képpel, szóval akár egyszerűbben is lehet:
  1. <img src="data:image/jpeg;base64,<?php  
  2. // Kép beolvasása, tartalom kódolása és kiírása  
  3. echo(base64_encode(file_get_contents($kep)));  
  4. ?>/>  
Sőt mi több, ha a kép a webről elérhető útvonalon van, akár ennyivel is meg lehetne úszni:
  1. <img src="<?=htmlspecialchars($kep);?>" />  
Ez azt feltételezi, hogy az adatbázisban a kép nevét tároltad el, nem pedig magát a képet. A nem releváns feldolgozó részeket természetesen kihagytam belőle.

Ezzel szemben, ha adhatok egy tanácsot, idővel ez a fajta gyúrjuk össze a PHP-t és a HTML-t megoldás nagyon meg fog szivatni. Ha ezen a téren akarsz tovább dolgozni, érdemes lesz megtanulni a megjelenítés és a működési logika elválasztását, sőt mi több, egy kicsit érdemes belekóstolni az MVC-be is. A Webtudoron annak idején jól kiveséztük a témát, de szép számmal találsz róla cikket is.
8

Köszönet

CzP · 2017. Ápr. 22. (Szo), 16.57
Valóban más lett a leányzó fekvése, ez a base64 kódolás csodát tett.
A további szívások számának csökkentése érdekében megnézem ezt az MVC dolgot is.
Köszönöm !
9

PHP

janoszen · 2017. Ápr. 22. (Szo), 19.20
Ha teheted, keruld a kepek kiszolgalasat PHP-n keresztul, inkabb linkeld be. SOKKAL gyorsabb ha nem kell a PHP-nak megcsamcsognia a kep adatokat.