Fischer.Ch: Auflösung eines Hochgeladenen bildes herausfinden.

Hallo,

ich lade Passbilder auf einen Webserver hoch. (nur JPG, PNG, TIF)
Nun möchte ich, aber auch prüfen ob diese den Normen entsprechen.

Was speziell ist möglich auszuwerten?
Was bei z.B. der Auflösung, welche ja eigentlich anhand der Größe der Datei ermittelt werden kann, muss im bezug auf die verschiedenen Bildformate in der Berechnung beachtet werden?
Wie bzw. Wo kann ich die Auswertung am besten vornehmen? (Script?, Client/Server?)

Viele Fragen...

Hoffe hier gibt es jemand der doetwas schon mal gemacht hat!

mfg

Ch.Fischer

  1. Moin

    Was speziell ist möglich auszuwerten?

    hiermit kann man Höhe, Breite und Image Typ heraus finden. Für die Auflösung habe ich nichts gefunden:

    http://www.php.net/manual/de/function.getimagesize.php

    regds
    Mike©

    --
    Freunde kommen und gehen. Feinde sammeln sich an.
    1. leider hab ich kein PHP zur Verfügung nur JavaScript und ABAP!

      greezle

      Ch.Fischer

      1. Hi,

        leider hab ich kein PHP zur Verfügung nur JavaScript und ABAP!

        Die benötigten Infos (Breite, Höhe, Farbtiefe) stehen im Header der Bilddatei. Du mußt also gezielt bestimmte Bytes der Datei auslesen können. Das geht mit JS nicht. Mit ABAP vermutlich schon.

        Bei JPEG, TIFF und GIF kann ich ggf. helfen, mit PNG habe ich keine Erfahrung - es wird da aber sicherlich nicht prinzipiell anders sein. ;-)

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        1. Hi,

          leider hab ich kein PHP zur Verfügung nur JavaScript und ABAP!

          Die benötigten Infos (Breite, Höhe, Farbtiefe) stehen im Header der Bilddatei. Du mußt also gezielt bestimmte Bytes der Datei auslesen können. Das geht mit JS nicht. Mit ABAP vermutlich schon.

          Bei JPEG, TIFF und GIF kann ich ggf. helfen, mit PNG habe ich keine Erfahrung - es wird da aber sicherlich nicht prinzipiell anders sein. ;-)

          Gruß, Cybaer

          Bei JPG hab ich diese Daten schon entdeckt (wikipedia sei dank), allerdings nur mit einem Hexeditor, leder bekomme ich aber einen binärdatenstrom (in der Form "1452DA23DA"), im TIF und PNG habe ich leider garnichts gefunden. hilfe wär klasse

          greez

          Ch.Fischer

          1. Hi,

            Bei JPG hab ich diese Daten schon entdeckt (wikipedia sei dank), allerdings nur mit einem Hexeditor, leder bekomme ich aber einen binärdatenstrom (in der Form "1452DA23DA"),

            Ja, das ist genau das, was Du brauchst.

            X ist z.B., von Beginn dieses Stroms an gerechnet, an der Stelle n der dortige Bytewert * 256 + der Bytewert an der Stelle n+1. Wenn das Bild also 260 Pixel breit ist, dann steht im Header irgendwo 0104 (01*256=256 + 04 = 260).

            n kann dabei unterschiedlich groß sein (z.B. 164). Welcher Wert für n der jeweils richtige ist, mußt Du anhand der Doku ermitteln.

            Gleiches gilt für TIFF und sicher auch für PNG.

            im TIF und PNG habe ich leider garnichts gefunden. hilfe wär klasse

            Google mal nach "TIFF specification" oder "TIFF file format", etc.

            Möglicherweise ist aber beim TIFF die Reihenfolge der Bytes (höherwertiges/niederwertiges Byte) auch vertauscht, je nachdem, ob es ein TIFF im Intel-Format oder im Motorola-Format ist (was zu Beginn des Headers definiert wird).

            Gruß, Cybaer

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
            1. Moin,

              Google mal nach "TIFF specification" oder "TIFF file format", etc.

              Na dann viel Spaß. Wenn ich mich recht erinnere hat diese "TIFF specification" mehrere hundert Seiten.

              regds
              Mike©

              --
              Freunde kommen und gehen. Feinde sammeln sich an.
              1. Hi,

                Na dann viel Spaß. Wenn ich mich recht erinnere hat diese "TIFF specification" mehrere hundert Seiten.

                :)

                Als ich in meinen Sourcen nachgeschaut habe, fiel mir auf, daß ich seinerzeit die Auflösung nur bei JPEG und GIF, nicht aber bei TIFF ermittelt habe - kannst Dir denken, warum. ;->

                Ist aber IMHO trotzdem machbar. ;-) The TIFF Image File Format scheint mir hilfreich zu sein. :-)

                Ansonsten: Schau doch mal nach TIFF-Sourcen im OpenSource/PD-Bereich. Sprache ist ja egal.

                Gruß, Cybaer

                --
                Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                1. Moin

                  Als ich in meinen Sourcen nachgeschaut habe, fiel mir auf, daß ich seinerzeit die Auflösung nur bei JPEG und GIF, nicht aber bei TIFF ermittelt habe - kannst Dir denken, warum. ;->

                  ich habe ein PHP Script geschrieben um zu prüfen ob ein TIF korrupt ist oder nicht. Dort wird unter anderem auch die Auflösung ausgelesen. Für jedes einzelne Image innerhalb des TIF, da es sich ja, wie bereits erwähnt, um ein Containerformat handelt.

                  Allerdings ist es so komplex, dass ich es selbst nicht mehr auf die husche lesen kann. Aus Zeitmangel hatte ich mir die Doku erspart :-(

                  regds
                  Mike©

                  --
                  Freunde kommen und gehen. Feinde sammeln sich an.
                  1. Hi,

                    ich habe ein PHP Script geschrieben

                    Ist das zugänglich für die Allgemeinheit? :-)

                    Ich brauche es zwar nicht, aber mein Server hat nahezu unbegrenzt Speicherplatz im Zweig "Scripte, die man vielleicht irgendwann mal studieren kann". Der will ja schließlich gefüllt werden ... ;-))

                    Gruß, Cybaer

                    --
                    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                    1. Moin Cybaer,

                      Ist das zugänglich für die Allgemeinheit? :-)

                      leider wird dort die Auflösung doch nicht ausgelesen. Ich habe mich von den Variablen $iRes=0; $XresPos=0; und $YresPos=0; dazu hinreisen lassen.

                      Allerdings ist hier das Script, welches bis zu einer bestimmten Tiefe prüft ob das TIF in Ordnung ist.

                        
                      <?  
                        
                      set_time_limit(0);  
                        
                      $Dir='./../data/pc_doc/bad';  
                        
                      $hDir=opendir($Dir);  
                        
                      while ( $file = readdir ($hDir) )  
                            {  
                       $error_level=0;  
                       $Byte_Read=0;  
                       $iRes=0;  
                       $Offset=0;  
                       $iz=0;  
                       $Prev_Tag=0;  
                       $XresPos=0;  
                       $YresPos=0;  
                        
                       $IntelMac='';  
                        
                       $tb=array();  
                        
                       $ext = strtoupper(strrchr($file, '.'));  
                        
                       if ( ($file != ".") && ($file != "..") && ($ext == '.TIF') )  
                          {  
                        $File=sprintf("%s/%s",$Dir,$file);  
                        
                        $file_size=filesize($File);  
                        
                        $pointer=@fopen($File,"rb");  
                        
                        if ( $pointer )  
                             {  
                         $tb=fread($pointer, 2);  
                        
                                $IntelMac=$tb[0];  
                        
                         if ($IntelMac != 'I' && $IntelMac != 'M' )  
                            {  
                          $error_level=2;  
                          fclose($pointer);  
                          continue;  
                            }  
                        
                         $Byte_Read=$Byte_Read+2;  
                        
                         #################  
                         # Check asterix #  
                         #################  
                        
                         $tb=fread($pointer, 2);  
                        
                         if ( $IntelMac == 'I' && $tb[0] == '*' && $tb[1] == 0 )  
                            $iRes=1;  
                        
                         if ( $IntelMac == 'M' && $tb[1] == '*' && $tb[0] == 0 )  
                            $iRes=1;  
                        
                         if ($iRes == 0 )  
                            {  
                          $error_level=2;  
                          fclose($pointer);  
                          continue;  
                            }  
                        
                         $Byte_Read=$Byte_Read+2;  
                        
                         ###########################  
                         # Get offset to first IFD #  
                         ###########################  
                        
                         $Bytes4=fread($pointer, 4);  
                        
                         $Byte_Read=$Byte_Read+4;  
                        
                         if ( $IntelMac == 'I' ) # little endian  
                            $arr=unpack("Vbyte",$Bytes4);  
                         else  
                            $arr=unpack("Nbyte",$Bytes4);  
                        
                         $Offset=$arr[byte];  
                        
                         if ( $Offset > $file_size )  
                            {  
                          $error_level=3;  
                          fclose($pointer);  
                          continue;  
                            }  
                        
                         $Skip=$Offset-$Byte_Read;  
                        
                         if ( $Skip > 0 )  
                            {  
                          for ( $i=0; $i<$Skip; $i++ )  
                              {  
                           $dummy=fread($pointer, 1);  
                              }  
                            }  
                        
                         $Byte_Read=$Byte_Read+$Skip;  
                        
                         $get_next=0;  
                        
                         while ( $get_next == 0 )  
                               {  
                        
                         $iz++;  
                        
                         $Prev_Tag=0;  
                        
                         $Bytes2=fread($pointer, 2);  
                        
                         $Byte_Read=$Byte_Read+2;  
                        
                         if ( $IntelMac == 'I' ) # little endian  
                            $arr=unpack("vbyte",$Bytes2);  
                         else  
                            $arr=unpack("nbyte",$Bytes2);  
                        
                         $Entries=$arr[byte];  
                        
                         if ( $Entries < 1 )  
                            {  
                          $error_level=4;  
                          break;  
                            }  
                        
                         for ( $i=0; $i<$Entries; $i++ )  
                             {  
                          $Bytes2=fread($pointer, 2);  
                          $Byte_Read=$Byte_Read+2;  
                        
                          if ( $IntelMac == 'I' ) # little endian  
                             $arr=unpack("vbyte",$Bytes2);  
                          else  
                             $arr=unpack("nbyte",$Bytes2);  
                        
                          $Field_Tag=$arr[byte];  
                        
                          if ( $Prev_Tag > $Field_Tag )  
                             {  
                           $error_level=5;  
                           break;  
                                }  
                        
                          $Prev_Tag=$Field_Tag;  
                        
                          $Bytes2=fread($pointer, 2);  
                          $Byte_Read=$Byte_Read+2;  
                        
                          if ( $IntelMac == 'I' ) # little endian  
                             $arr=unpack("vbyte",$Bytes2);  
                          else  
                             $arr=unpack("nbyte",$Bytes2);  
                        
                          $Field_Type=$arr[byte];  
                        
                          if ( $Field_Type < 0 || $Field_Type > 12 )  
                             {  
                           $error_level=6;  
                           $break;  
                                }  
                        
                          $Bytes4=fread($pointer, 4);  
                          $Byte_Read=$Byte_Read+4;  
                        
                          if ( $IntelMac == 'I' ) # little endian  
                             $arr=unpack("Vbyte",$Bytes4);  
                          else  
                             $arr=unpack("Nbyte",$Bytes4);  
                        
                          $Field_Count=$arr[byte];  
                        
                          if ( $Field_Count < 0 )  
                             {  
                           $error_level=7;  
                           $break;  
                                }  
                        
                          $Field_Offset=0;  
                          $Field_Offset2=0;  
                          $Field_Offset3=0;  
                          $Field_Offset4=0;  
                        
                          $found=0;  
                        
                          if ( $Field_Type == 1 )  
                             {  
                           $Bytes4=fread($pointer, 4);  
                           $Byte_Read=$Byte_Read+4;  
                        
                           if ( $IntelMac == 'I' ) # little endian  
                              $arr=unpack("Vbyte",$Bytes4);  
                           else  
                              $arr=unpack("Nbyte",$Bytes4);  
                        
                           $Field_Offset=$arr[byte];  
                           $found=1;  
                             }  
                        
                          if ( $Field_Type == 2 )  
                             {  
                           $Bytes2=fread($pointer, 2);  
                           $Byte_Read=$Byte_Read+2;  
                        
                           if ( $IntelMac == 'I' ) # little endian  
                              $arr=unpack("vbyte",$Bytes2);  
                           else  
                              $arr=unpack("nbyte",$Bytes2);  
                        
                           $Field_Offset=$arr[byte];  
                        
                           $Bytes2=fread($pointer, 2);  
                           $Byte_Read=$Byte_Read+2;  
                        
                           if ( $IntelMac == 'I' ) # little endian  
                              $arr=unpack("vbyte",$Bytes2);  
                           else  
                              $arr=unpack("nbyte",$Bytes2);  
                        
                           $Field_Offset2=$arr[byte];  
                           $found=1;  
                             }  
                        
                          if ( $Field_Type == 4 )  
                             {  
                           $Buffer=fread($pointer, 1);  
                           $Byte_Read=$Byte_Read+1;  
                           $Number = ord($Buffer{0}) | (ord($Buffer{1})<<8) | (ord($Buffer{2})<<16) | (ord($Buffer{3})<<24);  
                           $Field_Offset=$Number;  
                        
                           $Buffer=fread($pointer, 1);  
                           $Byte_Read=$Byte_Read+1;  
                           $Number = ord($Buffer{0}) | (ord($Buffer{1})<<8) | (ord($Buffer{2})<<16) | (ord($Buffer{3})<<24);  
                           $Field_Offset2=$Number;  
                        
                           $Buffer=fread($pointer, 1);  
                           $Byte_Read=$Byte_Read+1;  
                           $Number = ord($Buffer{0}) | (ord($Buffer{1})<<8) | (ord($Buffer{2})<<16) | (ord($Buffer{3})<<24);  
                           $Field_Offset3=$Number;  
                        
                           $Buffer=fread($pointer, 1);  
                           $Byte_Read=$Byte_Read+1;  
                           $Number = ord($Buffer{0}) | (ord($Buffer{1})<<8) | (ord($Buffer{2})<<16) | (ord($Buffer{3})<<24);  
                           $Field_Offset4=$Number;  
                        
                           $found=1;  
                             }  
                        
                        
                          if ( $found == 0 )  
                             {  
                           $Bytes4=fread($pointer, 4);  
                           $Byte_Read=$Byte_Read+4;  
                        
                           if ( $IntelMac == 'I' ) # little endian  
                              $arr=unpack("Vbyte",$Bytes4);  
                           else  
                              $arr=unpack("Nbyte",$Bytes4);  
                        
                           $Field_Offset=$arr[byte];  
                             }  
                        
                          if ( $Field_Type == 1 && $Field_Count > 1 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 2 && $Field_Count > 3 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 3 && $Field_Count > 1 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 4 && $Field_Count > 1 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 5 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                        
                          if ( $Field_Type == 6 && $Field_Count > 1 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 7 && $Field_Count > 1 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 8 && $Field_Count > 1 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 9 && $Field_Count > 1 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 10 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 11 && $Field_Count > 1 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Type == 12 && $Field_Offset > $file_size )  
                             {  
                           $error_level=8;  
                           break;  
                                }  
                        
                          if ( $Field_Tag == 258 && $Field_Type == 3 && $Field_Offset != 1 )  
                             {  
                           $error_level=9;  
                           break;  
                                }  
                        
                          if ( $Field_Tag == 282 && $Field_Type == 5 )  
                             $XresPos=$Field_Offset;  
                        
                          if ( $Field_Tag == 283 && $Field_Type == 5 )  
                             $YresPos=$Field_Offset;  
                        
                        
                          if ( $Field_Tag == 259 && $Field_Type == 3 && $Field_Offset != 4 )  
                             {  
                           $error_level=10;  
                           break;  
                                }  
                        
                          if ( $Field_Tag == 257 && $Field_Type == 3 && $Field_Offset < 16 )  
                             {  
                           $error_level=11;  
                           break;  
                                }  
                        
                          if ( $Field_Tag == 256 && $Field_Type == 3 && $Field_Offset < 16 )  
                             {  
                           $error_level=12;  
                           break;  
                                }  
                        
                             } # End of walk through the entries  
                        
                         if ( $error_level > 0 )  
                            break;  
                        
                         ################  
                         # Get next IFD #  
                         ################  
                        
                         $Bytes4=fread($pointer, 4);  
                        
                         $Byte_Read=$Byte_Read+4;  
                        
                         if ( $IntelMac == 'I' ) # little endian  
                            $arr=unpack("Vbyte",$Bytes4);  
                         else  
                            $arr=unpack("Nbyte",$Bytes4);  
                        
                         $Offset=$arr[byte];  
                        
                         if ( $Offset != 0 )  
                            {  
                          if ( $Offset > $file_size )  
                             {  
                           $error_level=14;  
                           fclose($pointer);  
                           break;  
                                }  
                        
                          $Skip=$Offset-$Byte_Read;  
                        
                          if ( $Skip > 0 )  
                             {  
                           for ( $i=0; $i<$Skip; $i++ )  
                               {  
                            $dummy=fread($pointer, 1);  
                               }  
                             }  
                        
                          $Byte_Read=$Byte_Read+$Skip;  
                        
                            }  
                         else  
                            {  
                          $get_next=1;  
                            }  
                        
                        
                               } # End of get next  
                        
                         fclose($pointer);  
                        
                             } # End of valid pointer  
                        else  
                           {  
                         $error_level=1;  
                           }  
                        
                          } # End of is file  
                        
                      if ( $error_level > 0 )  
                         {  
                          echo 'File ' .$file. ' Error='.$error_level.'<br>';  
                          $total++;  
                         }  
                            } # End or read dir  
                        
                      closedir($hDir);  
                        
                      echo $total;  
                        
                      ?>  
                      
                      

                      regds
                      Mike©

                      --
                      Freunde kommen und gehen. Feinde sammeln sich an.
                      1. Hi,

                        leider wird dort die Auflösung doch nicht ausgelesen.

                        Pfui, pfui, Schande über Dich! ;-)

                        Ich habe mich von den Variablen $iRes=0; $XresPos=0; und $YresPos=0; dazu hinreisen lassen.

                        Na ja, ging mir im Thread ja auch ein wenig so. :)

                        Allerdings ist hier das Script, welches bis zu einer bestimmten Tiefe prüft ob das TIF in Ordnung ist.

                        Merci! :-))

                        Gruß, Cybaer

                        --
                        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
              2. Hallo,

                Google mal nach "TIFF specification" oder "TIFF file format", etc.
                Na dann viel Spaß. Wenn ich mich recht erinnere hat diese "TIFF specification" mehrere hundert Seiten.

                das kann ich mir gut vorstellen - wenn man bedenkt, dass es "DAS" TIFF-Format eigentlich gar nicht gibt. ;-)
                Denn TIFF ist ja, ähnlich wie AVI, eigentlich nur ein Containerformat für verschiedenste Grafikformate. Das erklärt auch die zahlreichen Probleme mit Programmen, die angeblich TIFF unterstützen, dann aber doch viel TIFF-Dateien nicht öffnen können.

                So long,

                Martin

                --
                Küssen ist die schönste Methode, eine Frau zum Schweigen zu bringen.
                1. Hi,

                  Denn TIFF ist ja, ähnlich wie AVI, eigentlich nur ein Containerformat für verschiedenste Grafikformate. Das erklärt auch die zahlreichen Probleme mit Programmen, die angeblich TIFF unterstützen, dann aber doch viel TIFF-Dateien nicht öffnen können.

                  Ja. Aber height & width gehören zu den Basic-Tags! =;-)

                  Gruß, Cybaer

                  --
                  Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
            2. Dankö,

              hab da was zu gefunden...

              http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html

              http://www.libpng.org/pub/png/book/chapter11.html

              greez

              Ch.Fischer

  2. Hi,

    ich lade Passbilder auf einen Webserver hoch. (nur JPG, PNG, TIF)
    Nun möchte ich, aber auch prüfen ob diese den Normen entsprechen.

    das habe ich zwar noch nicht gemacht, ich weiß auch nicht, welchen Voraussetzungen diese Bilder entsprechen müssen. Trotzdem ein paar Anmerkungen...

    Was bei z.B. der Auflösung, welche ja eigentlich anhand der Größe der Datei ermittelt werden kann, ...

    Oh nein, die Dateigröße sagt _nichts_ über die Auflösung des Bildes aus. Sowohl JPEG, als auch GIF, als auch PNG sind üblicherweise komprimiert, dadurch geht jeglicher Zusammenhang zwischen Dateigröße und Auflösung verloren.

    Wie bzw. Wo kann ich die Auswertung am besten vornehmen? (Script?, Client/Server?)

    Clientseitige Überprüfung kannst du (fast) aus deinen Überlegungen streichen. Zwar kannst du mit

    var bild = new Image();
     bild.src = "bildname";

    ein Bild laden und hast dann über das Objekt bild auch Zugriff auf einige Eigenschaften. Aber Javascript kann nicht vorausgesetzt werden; eine solche Überprüfung kann also bestenfalls ein zusätzliches Schmankerl sein, um _vor_ dem Hochladen schon zu erkennen, dass ein bestimmtes Bild ungeeignet ist. Aber da diese Technik nicht voraussetzbar ist, _muss_ die Überprüfung in jedem Fall serverseitig gemacht werden. Welche Scriptsprache da zum Einsatz kommt (z. B. PHP, Perl, ...), ist von deinen Kenntnissen abhängig und davon, was dein Webhoster überhaupt anbietet.

    Hope that helps...
    So long,

    Martin

    --
    Auf jeden Menschen auf der ganzen Welt entfallen statistisch gesehen etwa 3000 Spinnen, wie Wissenschaftler jetzt festgestellt haben.
    Wer will meine haben? Denn ich will sie bstimmt nicht.