Breite und Höhe einer Grafik ermitteln



  • Hallo.

    Ich möchte gern die Breite und Höhe einer JPG Grafik ermitteln, welche nicht dargestellt wird. Gibt es dafür eine Komponente oder muss ich es extra in ein TImage einladen und dann von den Image Eigenschaften die Werte ablesen?
    Sind 20 große Grafiken, das ist leider etwas langsam. 😞



  • Hallo

    Im Bilder gibt es dafür keine Komponente (außer dem TJPEGImage, das du ja nicht willst). Du must also externe Komponenten im Netz suchen. Eventuell reicht es ja auch, wenn du dir im Netz die Definition des JPEG-Dateiformates anschaust, dann kannst du auch ohne jede Komponente nur mit TFileStream/std::fstream diese Angaben auslesen.

    bis bald
    akari





  • Vielen Dank!

    Gibt es sowas wie SetLength auch in CBuilder5?

    // Now make the string longer
    SetLength(myString, 25); // DELPHI

    in CBuilder gibt es nur ein
    AnsiString& __fastcall SetLength(int newLength);
    Doku sagt dazu: "Ein String kann mit SetLength nicht verlängert werden."

    Und Swap() tauscht vermutlich das HI und LO Byte in einem Word. Wie realisiert man das mit der VCL in CBUilder5? 🤡



  • Hallo

    Du must den Text aus der BCB-Hilfe auch zuende lesen, denn da steht :

    Die Methode gibt den geänderten Ergebnis-String zurück.

    Und zu Swap :
    Was Swap macht weiß ich nicht, in meinem BCB5 gibt es diese Funktion offentbar nicht. Falls es wirklich die Bytes tauscht dann schau mal ins C oder C++ Forum, da findest du bestimmt entsprechende Implementationen.

    bis bald
    akari



  • Im Delphi Beispiel steht Pos()

    // Delphi
    Index := Pos('JFIF' + #$00, Buffer);

    // CBuilder 5
    int Index = Buffer.Pos("JFIF\0"); // oder auch "JFIF"

    Aber er findet in keiner JPG einen Index > -1
    Liegt das daran das vorher vor dem "JFIF" String eine (hex)00 in der Datei steht und er die Suche dort abbricht? Wieso sollte das dann aber in Delphi klappen? Kann wer helfen? 🙂



  • Wohl egal, an der Stelle wie es http://www.swissdelphicenter.ch/en/showcode.php?id=1957 beschreibt steht nie und nimmer die Auflösung der JPG. Schade. 😞



  • Ich vermute mal drei Fehler:

    1. Du verwechselst Auflösung mit Bildgröße in Pixel.
    2. Wie das Delphibeispiel (für Auflösung) funktioniert ist mir nicht ganz klar. In C++ wird dir die Nullterminierung von AnsiString jedenfalls nen Strich durch die Rechnung machen.
    3. Dein JPG ist vielleicht Exif codiert. Da passt das Beispiel sowieso nicht.

    vielleicht hilft dir das weiter:
    http://www.w3.org/Graphics/JPEG/jfif3.pdf



  • Der Code scheint tatsächlich falsch zu sein. Ich habe mir mal das Format angeschaut:
    http://www.obrador.com/essentialjpeg/headerinfo.htm
    Das scheint aber aufwändiger zu sein. Das Format besteht aus verschiedenen Markern, du brauchst den frame marker (FFC0). Du müßtest also dich zu diesem vorhangeln, also Marker lesen, ist es FFC0?. Wenn nicht nächste zwei Bytes lesen als Offset zum nächsten Marker interpretieren und nach vorn springen. Dort, nach der sample precision steht X und Y als big endian.
    Hier ist noch ein Delphi-Beispiel:
    http://www.swissdelphicenter.ch/en/showcode.php?id=1698
    Ich weiß aber nicht ob dieses diesmal korrekt ist. Das dortige TMotorolaWord scheint ein 16b short big endian zu sein.



  • Danke für die Hilfe!

    @Morris Szyslak
    zu1. Ja das habe ich auch gemerkt nach diversen testen. Wobei ich verwirrt bin. Auflösung ist für mich immer eine Pixelhöhe und Pixelbreite. Selbst Windows sagt Bildschirmauflösung für einen 1280x1024 Desktop.

    Btw in JPG liest man ab Byte 163 die Höhe und dann Breite. Zumindest bei allen denen die ich hier habe. Aber ob das so allgemein ist, keine Ahnung ^^°

    Ich mach lieber doch total simpel TJPEGImage. 🙄
    Faulheit sieht! 😉



  • Du kannst auch aus der exif Info die Breite und Höhe bekommen.
    http://www.codeproject.com/KB/graphics/cexif.aspx


Log in to reply