Bilder anzeigen



  • Hallo,

    ich bräuchte mal etwas Input für die richtige und sinnvolle Vorgehensweise.
    Die Details und Benutzung der API-Funktionen kann ich mir dann selbst raussuchen. Ich habe auch schon mit HBITMAP und Co. gearbeitet, möchte aber nichts irgendwie zurecht schlunzen, was zwar geht, aber "unprofessionell" ist.

    Ich habe ein Window in dem ich ein Bild anzeigen möchte.
    Das Bild wird selbst erstellt und liegt in einem eigenen Bildformat vor. Es kann 8 bit und 16 bit sein. Vielleicht später auch mehr. Ist aber egal.
    Der Zugriff über Getter und Setter. Internes Format des Programms ist float von 0.0f bis 1.0f.

    float GetRed(unsigned int x, unsigned int y)
    

    Wie geht ich geschickt vor?

    Vorallem möchte ich das Bild auch vergrößern und verkleinern können und im Bildfenster verschieben. Hier könnte ich die Windows HBITMAP und Co. Repräsentation nehmen oder jedesmal ein eigenes Bild entsprechend rendern.

    Was mache ich mit 16 bit Bildern? Meines Wissens sind die Winapi-Funktionen nur 8bit. Wie zeige ich 10bit Bilder an? Oder ist das automatisch, wenn die Graphikkarte das kann (meine ist nur 8bit).

    Gruß Thomas



  • ThomasT schrieb:

    Internes Format des Programms ist float von 0.0f bis 1.0f.

    float GetRed(unsigned int x, unsigned int y)
    

    Üblicherweise verwendet das BMP-Format RGB-Werte; was bedeutet bei Dir der float-Wert? Sind das Graustufen ?

    ThomasT schrieb:

    Was mache ich mit 16 bit Bildern? Meines Wissens sind die Winapi-Funktionen nur 8bit. Wie zeige ich 10bit Bilder an? Oder ist das automatisch, wenn die Graphikkarte das kann (meine ist nur 8bit).

    Ich glaube nicht das heute wirklich noch 8 Bit Grafikkarten (256 Farben ?) verwendet werden ...

    Wenn es ganz exotische Farbtiefen wie 10 Bit sein sollen, was BMP offiziell nicht unterstützt, müsste man es wohl mit sinnvollen BITMAPINFOHEADER Werten selbst programmieren.

    Oder sind die 10 bit Graustufen? Lässt sich jedenfalls schlecht durch drei teilen ...

    16 Bit Bitmaps bestehen üblicherweise aus einem WORD Array mit jeweils 5Bit für rot, grün und blau.



  • Hallo,

    das war anscheinend missverständlich.
    Mit 8 bit meinte ich 8 bit je für R, G und B. Also 16 Mio Farben. Insgesamt also 24 bit (oder 32 mit alpha).

    Ich bin echt nicht auf die Idee gekommen, jemand denkt bei 8 bit tatsächlich an 256 Farben ...

    Meine float Werte gehen von 0 bis 1.0. Und bedeuten dann eben in 8 bit 0 bis 255.

    Wie das genau ist, ist eigentlich wurscht. Entscheidend ist, dass ich mein eigenes Format habe und das dann anzeigen möchte.

    D.h. ich lade kein Bitmap mit LoadBitmap etc.

    Ich muss aber wohl irgendein Bitmap erzeugen und dann meine Werte hinein kopieren. Die Frage ist wie am besten.

    Ich möchte auch kein Bitmap einfach so erzeugen, sondern die Pixel in WM_PAINT an den Bildschirm, resp. DC klatschen ...

    Thomas



  • Hallo,

    alle Bilder mit bis zu 8 Bit je Farbkanal kannst du ja als Standard (A)RGB-Bitmap erzeugen, nur bei mehr als 8 Bit (z.B. 10, 12 oder 16 Bit) wirst du auf Techniken wie z.B. Fensterung (Computertomographie) zurückgreifen müssen (d.h. eine Skalierung bzw. ein Ausschnitt des gesamten Farbspektrums verwenden).

    Bei einem statischen Bild würde sich aber trotzdem die Vorab-Erzeugung einer Bitmap lohnen (und diese dann einfach im WM-PAINT darstellen), nur bei einer Animation bzw. Video würde ich on-the-fly das pixelweise Setzen durchführen.



  • ThomasT schrieb:

    das war anscheinend missverständlich.
    Mit 8 bit meinte ich 8 bit je für R, G und B. Also 16 Mio Farben. Insgesamt also 24 bit (oder 32 mit alpha).

    Ich bin echt nicht auf die Idee gekommen, jemand denkt bei 8 bit tatsächlich an 256 Farben ...

    Hab schon eine etwas längere History, "früher war 256 Farben schon viel; und auch teuer 😉

    ThomasT schrieb:

    Meine float Werte gehen von 0 bis 1.0. Und bedeuten dann eben in 8 bit 0 bis 255.

    Achso, daher GetRed(); würde Funktionen empfehlen die RGB-Werte lesen und schreiben.

    ThomasT schrieb:

    Ich muss aber wohl irgendein Bitmap erzeugen und dann meine Werte hinein kopieren. Die Frage ist wie am besten.

    Speicher besorgen, Struktur initialisieren und die RGB-Werte anhängen, Fertig!

    http://msdn.microsoft.com/de-de/library/windows/desktop/dd183391(v=vs.85).aspx

    ThomasT schrieb:

    Ich möchte auch kein Bitmap einfach so erzeugen, sondern die Pixel in WM_PAINT an den Bildschirm, resp. DC klatschen ...

    Da wäre aber genau eine Bitmap naheliegend, oder ?



  • Eins meiner Teilprobleme ist, dass ich anscheinend die Pixel eines Bitmaps für die Anzeige nicht mehr ändern kann. Ich muss es entweder immer neu erzeugen. Oder irgendwie memcopy durchführen.



  • ThomasT schrieb:

    Ich habe ein Window in dem ich ein Bild anzeigen möchte.

    Wo isses denn ?

    ThomasT schrieb:

    Das Bild wird selbst erstellt und liegt in einem eigenen Bildformat vor. Es kann 8 bit und 16 bit sein. Vielleicht später auch mehr. Ist aber egal. Der Zugriff über Getter und Setter.

    Internes Format des Programms ist float von 0.0f bis 1.0f.

    float GetRed(unsigned int x, unsigned int y)
    

    Was hast Du denn an Code schon am Laufen?

    Müsste ja in etwa so aussehen, oder ?

    case WM_PAINT:
       hdc = BeginPaint (hWnd, &ps) ;
       if(pBmi != NULL) 
    	DrawMyBitmap(hdc, 0, 0, pBmi, SRCCOPY);
       EndPaint (hWnd, &ps) ;
       break;
    

    Wobei die Funktion so aussehen könnte:

    BOOL DrawMyBitmap(HDC hDC, INT x, INT y, BITMAPINFO *pBmi, DWORD dwROP);
    

    Aber da musst Du schon selbst was vorschlagen - können wir dann gerne diskutieren.


Anmelden zum Antworten