Willkommen in unserer Community

Werde Teil unserer Community und registriere dich jetzt kostenlos ...

JPEG File: Breite + Höhe des Bildes ermitteln

Dieses Thema im Forum "Off Topic" wurde erstellt von Dirk, 4. März 2018.

Schlagworte:
  1. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.142
    Zustimmungen:
    115
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Map
    Hallo zusammen,

    ich möchte die Breite und Höhe eines JPEG Images ermitteln (Datei: JFIF).

    Vielleicht hat dies von euch schon mal jemand gemacht und kann mir eventuell Tipps geben, wie ich dies zuverlässig hinbekomme.


    Danke :)

    Dirk :ciao:
     
  2. addi

    addi Mitglied

    Registriert seit:
    2. September 2013
    Beiträge:
    88
    Zustimmungen:
    3
    Ort:
    Hamminkeln
    Sprachen:
    BascomAVR, C, Assembler
    Hmmmm... gimp ist dein freund
    73 de addi
     
  3. Mikro23

    Mikro23 Mitglied

    Registriert seit:
    2. Januar 2017
    Beiträge:
    211
    Zustimmungen:
    15
    Ort:
    Großraum Hannover
    Sprachen:
    C, Assembler
    Map
    Mit GIMP: Bild -> Bildeigenschaften
    zeigt Bildgröße in Pixel und Druckgröße in mm.
    Ähnliches gibt es sicher auch bei vielen anderen Bildbearbeitungsprogrammen.
     
  4. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.142
    Zustimmungen:
    115
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Map
    Danke für die Antworten.

    Breite und Höhe möchte (oder muss) ich selber ermitteln (Mikrocontroller-Projekt), habe also keine Tools wie Gimp zur Verfügung.
     
  5. Mikro23

    Mikro23 Mitglied

    Registriert seit:
    2. Januar 2017
    Beiträge:
    211
    Zustimmungen:
    15
    Ort:
    Großraum Hannover
    Sprachen:
    C, Assembler
    Map
    Dann wirst Du Dich wohl durch sowas durchquälen müssen.
    Die Hilfsprogramme dazu - jpegtran, cjpeg und djpeg - müssen ja auch irgendwie an die Daten rankommen.
    Alles Open Source.
     
  6. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.142
    Zustimmungen:
    115
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Map
    Danke für die den Tipp.

    Da muss ich mich wohl durchquälen. :)

    Ich hatte auf einen Code-Snippet gehofft, aber vielleicht kommt ja noch was :D
     
  7. addi

    addi Mitglied

    Registriert seit:
    2. September 2013
    Beiträge:
    88
    Zustimmungen:
    3
    Ort:
    Hamminkeln
    Sprachen:
    BascomAVR, C, Assembler
  8. Hemi

    Hemi Premium Benutzer

    Registriert seit:
    30. November 2008
    Beiträge:
    963
    Zustimmungen:
    4
    Ort:
    Korntal-Münchingen, Germany
    Sprachen:
    C, C++, PHP, Java
    Map
    Es geht auch mit dem "Office picture manager" aus dem Office Paket.

    Alternativ IrfanView :)

    Dirk, verrate uns doch, was Du machen willst :)
     
  9. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.142
    Zustimmungen:
    115
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Map
    @Hemi : Ich benötige es für Mikrocontrollersoftware. Ein PC Programm kann ich leider nicht nutzen.

    @addi : Danke für den Link zu einer Lösung.
    Ich habe mal schnell reingeschaut. Hir wird auch nach dem 0xFFC0 Marker im header der JFIF Datei gesucht, danach kommen Breite und Höhe.
    Das hatte ich auch erst mal so gemacht. Ich denke das ist aber so nicht zuverlässig. Es wird nicht berücksichtigt, ob andere Marker zuvor mit Daten erscheinen. Da kann nämlich ein FFC0 in Daten fälschlicherweise als Marker erkannt werden. Abmaße werden in dem Fall nicht richtig gelesen. Bei mir war von etwa 40 Bildern eins dabei, bei dem die Markerposition nicht richtig erkannt wurde. Es ist anscheinend leider nicht so einfach wie bei bmp oder png.
     
  10. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.648
    Zustimmungen:
    51
    Ort:
    127.0.0.1 ;)
    Sprachen:
    Assembler, LunaAVR, VB.Net, Python, C#
    Ich selbst habe nie damit gearbeitet, aber laut Wikipedia Artikel sieht es mir wie ein TLV-ähnliches Protokoll aus.
    Die ersten 2 Bytes definieren den Typ, die nächsten 2 Bytes die Länge der folgenden Daten, danach ggf. die Daten ansich.

    Sucht man jetzt nur nach 0xFFC0 kann man ggf. zu früh anfangen die Daten zu lesen, weil das Bytemuster in den Daten davor auch vorkommen könnte. Man muss dann wirklich schon das Protokoll auswerten und uninteressante Pakete überspringen. So in der Art muss ich das auch machen, du weißt schon wofür.

    Ein fertigen Code hab ich jetzt aber leider auch nicht für dich.
    Ich und C, das wäre eh so eine Sache ;)
     
  11. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.142
    Zustimmungen:
    115
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Map
    Gut, dann werde ich es heute Abend mal so probieren. Alle Marker-Blöcke die vorher kommen verwerfen.
     
  12. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.142
    Zustimmungen:
    115
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Map
    Ich habe es nun hinbekommen, hier einmal der relevante Bereich ...



    CodeBox C und C++
    
    tImage Image;
    uint32_t size;
    uint32_t address;
    uint16_t marker;
    uint16_t segsize;
    bool success;
    
    // ...
    
    Cont_Flash_Read_Enable(address);
    
    marker = (uint16_t) FLASH_SPI_RW(0xFF)<<8;    // SOI marker
    marker |= FLASH_SPI_RW(0xFF);
    
    if (marker != 0xFFD8)
    {
      FLASH_CS_HI
      return false;        // no JPEG file
    }
    
    size = Image.size;
    address += 2;    // SOI marker size
    
    do
    {
    
      marker = (uint16_t) FLASH_SPI_RW(0xFF)<<8;
      marker |= FLASH_SPI_RW(0xFF);
    
      if (marker == 0xFFC0)
      {
        FLASH_SPI_RW(0xFF);
        FLASH_SPI_RW(0xFF);
        FLASH_SPI_RW(0xFF);
    
        // Height
        Image.height = (uint16_t)FLASH_SPI_RW(0xFF)<<8;
        Image.height |= FLASH_SPI_RW(0xFF);
    
        // Width
        Image.width = (uint16_t)FLASH_SPI_RW(0xFF)<<8;
        Image.width |= FLASH_SPI_RW(0xFF);
    
        break;
      }
    
      segsize = (uint16_t) FLASH_SPI_RW(0xFF)<<8;
      segsize |= FLASH_SPI_RW(0xFF);
    
      if (segsize < 2) break; // Error
    
      address += segsize + 2;
      Cont_Flash_Read_Enable(address);
    
      size -= (segsize + 2);
    
    } while (size > 0);
    
     
  13. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.648
    Zustimmungen:
    51
    Ort:
    127.0.0.1 ;)
    Sprachen:
    Assembler, LunaAVR, VB.Net, Python, C#
    Gratuliere :)
    Da das Problem ja nun behandelt ist, was hast du denn vor wenn man fragen darf?
     
  14. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.142
    Zustimmungen:
    115
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Map
    Nichts besonderes, kein bestimmtes Projekt. Ich habe meine Piktogramm-Funktionen ein bisschen überarbeitet, so dass diese nun auch mit unterschiedlichen Bildgrößen umgehen können, ohne dass ich die Größe explizit in der Kompilierungsphase vorgebe.
     
  15. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.183
    Zustimmungen:
    7
    Ort:
    Hannover
    Sprachen:
    C
    Map
    Hört sich interessant an..
     
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)