Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] EXIF i ISOSpeedRatings
Forum PHP.pl > Forum > Przedszkole
Regss
Witam! Mam następujący problem, chcem z obrazka jpeg wyciągnąć dane o ISOSpeed napisałem taki skrypt:

Kod
<?
$exif = exif_read_data('test3.jpg', 'Exif');
echo $exif['Model']; echo "<br>";
echo $exif['DateTime'];echo "<br>";
echo $exif['ExposureTime'];echo "<br>";
echo $exif['ISOSpeedRatings'];echo "<br>";
echo $exif['FNumber'];echo "<br>";
echo $exif['FocalLength'];echo "<br>";
?>


ale niestety miejsce gdzie ma się pojawić informacja o ISOSpeed jest puste, tak jak by ISOSpeedRatings wogóle nie działało, może mi ktoś pomóc?
strife
Nie miałem styczności z tą instrukcją, jednak myślę, że powinieneś zacząć od prostego sprawdzenia czy taki klucz w tablicy istnieje w taki sposób:
  1. <?php
  2.  
  3. $exif = exif_read_data('test3.jpg', 'Exif');
  4. echo '<pre>';
  5. echo print_r( $exif );
  6.  
  7. ?>

I teraz masz jak na tacy wszystkie elementy. Jak znajdę coś więcej dopisze winksmiley.jpg

Może pomyliłeś wielkość liter?
Master Miko
1. Jakiego aparatu używasz i czy jest on analogowy czy cyfrowy?
2. Jaką masz wersję exifa?
3. Jaki masz program do konwertowania zdjęć?

Pytam się, bo exif nie do końca wyciąga wszyskie dane. Np w ogóle nie rusza wielu danych zdjęcia po obróbce photoshopa...

Ale jeśli ta funkcja spełnia Twoje wymagania, to ok smile.gif
Regss
Aparat to cyfrak Canon PowerShot A75, program do zrzucania fotek to canon zoombrowser dołączony do aparatu, zgodność z EXIF 2.2, testuje na Apache2 + php 5.0 zdjęć nie konwertowałem inne dane takie jak przesłone, czas migawki skrypt podaje prawidłowo. Po uruchomieniu skryptu podanego przez strife'a większość danych wyskakuje prawidłowa lecz gdzieniegdzie są "kwadraciki" a tej funkcji ISOSpeedRatings nie pokazuje na innym zdjęciu robionym nikonem też cyfruwką wszystko jest ok i pokazuje tą funkcje. Ale ciekawostką jest to, że testując skrypt exifer ze strony http://www.offsky.com/software/exif/index.php w fotce z canona wszystko jest jak należy. Lecz ten skrypt jest strasznie duży jak na funkcje którą ma spełniać.

P.S. Ja sie wogóle nie znam na php więc wybaczcie wszystko :roll2:
Master Miko
ee tam, nauczysz się snitch.gif smile.gif

No widzisz... exif by php ma problemy z niektórymi standardami.. (bo oczywiście każda firma musi robić własne...) daltego niektórzy piszą biblioteki, żeby ze wszystkim działało.

Ten exifer ciężki może jest (ok. 110kb) ale z kodu widać że dobrze działa bo przecież przeszukuje plik zdjęciowy!

Ja z kolei, znalazłem inny skrypt działający na postawie xmlu, który pobiera wartości, które tak naprawdę manualnie trzeba wpisać i niestety je jeszcze obrobić...ale zaimplementowałem go do innego skryptu - zapisaującego do bazy danych i w ten sposób robi się to raz.
Funkcje exifowe (może się myle) ale z kodu wygląda tak, że raczej potrzebują dużej mocy obliczeniowej.
Regss
No to pozostaje mi tylko urzyć tego exifer'a a wiesz może jak z niego korzystać bo przez tą funkcje print w index.php wyświetla się cała tablica a ja bym chciał tylko kilka wybranych tagów niestety nie ma nigdzie (albo ja niedowidze) opisanego jak z tego korzystać. np. jak wyświetlić tylko ISOSpeedRatings dalej sobie już poradze ;]
Master Miko
To pokaż tę tablicę smile.gif
Regss
Już doszedłem jak z niego korzystać jednak nie działa tak jak powinien ponieważ dla każdego zdjęcia robionego innym aparatem tworzy troche inną tablice. np.

Dla fotki robionej NIKONEM.
Kod
[SubIFD] => Array
        (
            [ExposureTime] => 1/20 sec
            [FNumber] => f 3.6
            [ExposureProgram] => Program
            [ISOSpeedRatings] => 200
            [ExifVersion] => version 2.2
            [DateTimeOriginal] => 2005:12:30 17:45:28


i żeby wywołać to musze wisać coś takiego: echo $result['SubIFD']['ISOSpeedRatings'];

Natomias już dla fotki zrobionej Canonem częśćtablicy w której zawarta jest informacja o ISO wygląda tak:
Kod
[SubIFD] => Array
        (
            [ExposureTime] => 1/250 sec
            [FNumber] => f 8
            [ExifVersion] => version 2.2
            [DateTimeOriginal] => 2006:05:07 13:04:01
            [DateTimedigitized] => 2006:05:07 13:04:01
            [ComponentsConfiguration] => YCbCr
            [CompressedBitsPerPixel] => 5
            [ShutterSpeedValue] => 1/250 sec
            [ApertureValue] => f 8
            [ExposureBiasValue] => 0 EV
            [MaxApertureValue] => f 4.8
            [MeteringMode] => Spot
            [Flash] => No Flash
            [FocalLength] => 16.21875 mm
            [MakerNote] => Array
                (
                    [MakerNoteNumTags] => 18
                    [Settings 1] => Array
                        (
                            [RAWDATA] =>
                            [Bytes] => 92
                            [Macro] => Macro
                            [SelfTimer] => Off
                            [Quality] => Superfine
                            [Flash] => Off
                            [DriveMode] => Single/Timer
                            [Unknown] => 0
                            [FocusMode] => 0
                            [ImageSize] => Large
                            [EasyShooting] => Manual
                            [DigitalZoom] => No Digital Zoom
                            [Contrast] => Normal
                            [Saturation] => Normal
                            [Sharpness] => Normal
                            [ISO] => 400
                            [MeteringMode] => 1
                            [FocusType] => Close-up (Macro)
                            [AFPointSelected] => 8197
                            [ExposureMode] => Manual
                            [LongFocalLength] => 519
                            [ShortFocalLength] => 173
                            [FocalUnits] => 32
                            [FlashActivity] => 65535
                            [FlashDetails] =>


i nie moge wyświetlić wogóle chociaż w tablicy dane te są zawarte.

Może zna ktoś jakiś inny dobry skrypt który systematyzuje wszystkie tablice od różnych aparatów?
Master Miko
no to może spróbuj zwykłym exifem smile.gif
ostatnio bawiłem się tą funkcją pod wpyłwem tej rozmowy.
Oto taki mały skrypcik który wyświela wszyskie informacjie (dałem all). No tylko jak mówiłem na samym początku, ma problemy z obróbką photoshopową :/

oto taki mały skrypcik, wygodny do testów:

  1. <?php
  2.  
  3.  
  4. if(isset($_GET['plik']) && !empty($_GET['plik'])) {
  5. $plik = $_GET['plik'];
  6. $plik = str_replace("./","",$plik);
  7.  
  8. $piP = pathinfo($plik);
  9. $ext = $piP['extension'];
  10.  
  11.  
  12. if(file_exists($plik) && is_file($plik) && in_array($ext, $allowedFiles)) {
  13.  
  14. echo "<table><tr><td>";
  15.  
  16. $exif = exif_read_data($plik, 'ANY_TAG', true, true);
  17. if(is_array($exif)) {
  18. foreach ($exif as $key => $section) {
  19. foreach ($section as $name => $val) {
  20. echo "$key.$name: $val<br>\n";
  21. }
  22. }
  23. } else { echo "No exif data"; }
  24. echo "</td><td>";
  25. echo '<img src="' . $plik . '"></td></tr></table>';
  26.  
  27.  
  28. } else {
  29. echo '<font color="red">Plik '. $plik .' nie istnieje! Spróbuj ponownie</font>';
  30. }
  31. }
  32.  
  33.  
  34. ?>


używasz tak: skrypt.php?=nazwazdjecia.jpg
obok wszyskich danych jakie w ogóle można wyciągnąć przez funkcje phpowską znajduje się zdjęcie.

Ale co do schematyzacji nie wiem czy to Cię zadowoli
Regss
Cytat(Master Miko @ 2006-05-08 11:57:11)
używasz tak: skrypt.php?=nazwazdjecia.jpg

chyba mała pomyłka powinno być: skrypt.php?plik=nazwazdjecia.jpg

pozwoliłem sobie zmodyfikować Twój skrypt na troche prościeszy bo nie działał nie wiem czemu:

Kod
<?php
$plik = $_GET['plik'];

$exif = exif_read_data($plik, 'ANY_TAG', true, true);
        if(is_array($exif)) {
        foreach ($exif as $key => $section) {
            foreach ($section as $name => $val) {
                echo "$key.$name: $val<br>\n";
            }
        }
        } else { echo "No exif data"; }
?>


tablice się ukazują ale jest w nich mały haos.

Zdjęcie wykonane canonem A75:
http://regss.no-ip.org/test/index.php?plik=test1.jpg
Wogóle nie ma tagu o ISO

Zdjęcie wykonane NIKONEM:
http://regss.no-ip.org/test/index.php?plik=test4.jpg
ISO jest ale też występuje mały haos.

Obydwa zdjęcia są prosto z aparatu nie konvertowane nawet nie otwierane w innych edytorach.

Może ma to coś wspólnego z moją wersją php, Apatcha2 albo z konfiguracją?
Jeśli możesz sprawdz te zdjęcie czy Tobie równierz wyskakują krzaczki:
http://regss.no-ip.org/test/test1.jpg
Master Miko
tak powinno być plik= smile.gif smile.gif

No jest w nich mały haos, ale dzięki nazwom można wyodrębnić poszczególne wartości smile.gif

a co do ISO... widać, że canon jest głupi i nie trzyma standardów exif...

test/test1.jpg - nie wyskakują mi krzaczki.

Jeśli masz najnowsze php i apacha 2 to znaczy że u Ciebie wszystko ok, ale nie wszystko ok u canona....
Regss
Czyli coś musi być nie tak u mnie, ponieważ mi przy test1.jpg wyskakuje pełno "krzaków" oto wycinek z przeglądarki:

http://regss.no-ip.org/test/screen.jpg

Dobrze myśle?
Master Miko
Wszystko jest ok. To jest exifowy tumbnail smile.gif
To jest tzw. zdjęcie w zdjęciu smile.gif
Tzn exif robi odrazu miniatrukę w exifie, żeby szybciej wczytywały się zdjęcia.
Regss
Znalazlem cos nowego poniewaz tamte rozwiazania mnie nie zadowalaly.
Mianowicie cos takiego: http://www.sentex.net/~mwandel/jhead/ napisany w jezyku c tylko nie moge napisac teraz skryptu ktory wykonal by mi operacje po wpisaniu czegos takiego:

Kod
<?php
$jhead = "usr/bin/jhead";
$image = "test1.jpg";
$command = "$jhead -exonly $image";
echo "$command";
?>


Ale wyskakuje mi tylko napis "usr/bin/jhead -exonly test1.jpg" moze mi ktos podpowiedziec jak to uruchomic? Bo ja jestem zielony w php.

edit:
Juz sam doszedlem:
Kod
<?php
  $PicFile = "c:/test1.jpg";
  exec("/usr/bin/jhead $PicFile", $OutputArray);
  $OutputString = implode($OutputArray, " ");
  print "<b>$OutputString</b>";
?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.