Image Viewer / Suche: Ideen zum Aufbau



  • Hallo,
    ich versuche seit einem leider doch schon größeren Zeitraum mir eine schnelle Image Viewer Komponente zu basteln (BCB). Der Versuch es auf TImage aufzusetzen scheiterte natürlich Fatal (viel zu langsam). Nun erfolgt die Darstellung mittels OpenGL und glDrawPixels ... Geht alles auch relativ schnell ... aber noch nicht schnell Genug ... sobald ich Panning / Zooming einbaue + vll. noch ein Malwerkzeug + Pinsel Anzeige anstatt des Mauszeigers wird alles zu langsam (Auflösungen von bis zu 3000 x 3000) (Andere Bildbetrachter auf meinem PC schaffen es aber ohne Probleme!)

    Nun zu meinen Fragen:
    - Sollte ich Lieber DirectX anstatt OpenGL nutzen? Habe mal gelesen das glDrawPixels sehr langsam wäre?
    - Kennt jemand Sources / Anleitungen / irgendetwas wo ich mich weiter bilden könnte in Richtung schneller Bild Darstellung?

    Ich weiß das mir keiner groß ohne Source helfen kann aber es ist auch eher die Theorie dahinter die ich wirklich brauche. Deshalb auch in diesem Bereich gepostet und nicht im BCB Bereich.

    Liebe Grüße
    Jens


  • Mod

    1. schneller als es dir opengl anzeigen kann, kannst du es wohl nicht machen, ist aber normalerweise auch ausreichend
    2. du benutzt opengl vermutlich falsch, z.b. jedes mal das komplette bild aus dem mainmemory in opengl laden, statt mit texturen zu cachen
    3. andere programme arbeiten nichtmal mit ogl, sondern meist mit simplen windows routinen, das geheimnis ist das nichts unsichtbares angezeigt wird (ist ja sonst logischerweise arbeit fuer die katz) und das nur geaenderte dinge neu angezeigt werden, nicht immer grundsaetzlich alles.
    4. gimp ist ein open source programm dass das macht.



  • zu 1. das ist schonmal gut war ich wenigstens nicht auf dem Holzweg
    zu 2. ich übergebe glDrawPixels einen Pointer auf das Bild im Mainmemory also schieb ich keine Speicher unötig hin und her
    zu 3. Mach ich auch so 😕
    zu 4. Gimp ist ein guter Gedanke da werd ich mir mal den Source durchblättern

    Erstmal danke! 🙂 Wenn jemand weitere Tips immer her damit 🙂



  • "zu 2. ich übergebe glDrawPixels einen Pointer auf das Bild im Mainmemory also schieb ich keine Speicher unötig hin und her "

    mit drawpixels schiebst du immer daten aus deinem hauptspeicher in deinen framebuffer.
    wenn du eine texture lädst, bleibt diese im grafikspeicher. wird also nicht bei jedem zeichenvorgang einmal über den bus geschoben. allerdings ist die sache mit dem malen dann nicht so einfach.



  • Zunächst einmal: Imageviewer mit Malwerkzeug? Was ist das denn? 🙂

    Also bei dir sind Pixel Buffer Objects die Lösung. Die gibts mit der ARB_pixel_buffer_object extension (es existiert auch die ältere EXT-Variante, aber nimm besser die ARB-Version). PBOs sind im OpenGL-Kern seit OGL-Version 1.5, und so ziemlich alle aktuellen Treiber sollten die beherrschen (auch die Intel-Dinger), da PBO-Support eine reine Treibersache ist (d.h. keine spezielle Hardwareanforderungen hat).

    Also, PBOs sind im Prinzip Puffer im Videospeicher, auf die du mittels Memorymapping zugreifen kannst. glMapBuffer, du kriegst einen Zeiger auf den Puffer, und kannst ihn füllen (oder nur einzelne Werte ändern). glUnmapBuffer, und das Mapping ist beendet. Beim Erstellen und Mappen des Puffers kann man Flags setzen, um das Verhalten anzupassen. Vorteile: du musst nicht mehr dauernd die Pixel rüberschaffen, und mit den richtigen Flags optimierst du das ganze (die Flags stehen in der Extensionbeschreibung).

    Wenn du PBOs nicht verwenden kannst, nimm eine Textur (am besten eine Rectangle Textur, die sind für deine Zwecke besser als die normalen 2D-Texturen), und füll Teile nach mit glTexSubImage2D.



  • stylistics schrieb:

    Hallo,
    ich versuche seit einem leider doch schon größeren Zeitraum mir eine schnelle Image Viewer Komponente zu basteln (BCB). Der Versuch es auf TImage aufzusetzen scheiterte natürlich Fatal (viel zu langsam).

    Schau Dir ev. mal auf WWW.DerAltenburger.de das Tool DigitalPhotoShifter an.
    (Da ist ein kostenloses Demo als Download - Windows- Programm)

    - Im Hauptfenster ist eine Anzeige mit Zoom/ Pan Funktionen
    - Zoom mit RollRad, Pan mit mittlerer Maus
    - mit LM wird ein "Rechteck" aufgezogen - dynamisch gezeichnet
    und am Ende der Bereich gezoomt/ ausgestanzt.

    Das Tool ist mit BCB gemacht. Falls das nicht zu langsam ist, kannst Du Dich mal melden. (Bin auch ab und zu im CBuilder- Forum)
    Ich hab aus der Anzeige- Kompo ne Ableitung gemacht, die Vector- Graphik zeichnet (eigene Datenstrukture!), die arbeitet auch recht flott (Masken über ein Bild).

    Ev. kann ich Dir ein paar Anregungen geben.

    Gruss
    frank


Anmelden zum Antworten