Sreenshot erstellen und auslesen



  • Sind in bitmap alle Pixel hintereinander drinne?
    Wenn ich nun den 2. Pixel aus der 3. Linie will (1/2) müsste ich bei der Auflösung 1280x700 die Position bitmap[2562] angeben?

    kann ich dieses bitmap array nicht in eine andere Struktur umwandeln um diese leichter zu verarbeiten z.B. in ein 2 Dimensionales Array?



  • wenn du das einfacher findest. aber wozu? liest du eigtl deinen eigenen code nicht? da haste doch 24 bit farbtiefe angegeben, also wird jeder pixel mithilfe dreier bytes dargestellt, rot, grün, blau.



  • wenn du das einfacher findest. aber wozu?

    Wollte nur wissen ob es möglich ist.

    liest du eigtl deinen eigenen code nicht? da haste doch 24 bit farbtiefe angegeben, also wird jeder pixel mithilfe dreier bytes dargestellt, rot, grün, blau.

    Hm ich hab jetzt etwas rumgespielt aber irgendwie komme ich nicht so recht weiter die Farbwerte der einzelnen Pixel auszugeben.
    Wie genau kann ich mir die Farbwerte aller oder bestimmter Pixel ausgeben?
    hack0r du meintest die Werte stehen alle in dem pointer von bitmap?



  • Hat jemand noch einen Tipp?



  • Ist >int*< nicht eigentlich falsch? Müsste da nich char* oder sowas stehen?

    Ich weiss nicht ob das auch für GetDIBits() gilt oder nur für CreateDIBSection, vermute aber mal ja:
    - Man muss die Stride-Größe beachten
    - Bei infobmp.bmiHeader.biHeight positiv sind die Pixeldaten umgedreht. D.h. der Pixel unten links steht im Array ganz vorne.
    - Bei infobmp.bmiHeader.biHeight negativ: Linker oberster Pixel steht an erster Stelle im Array
    - Reihenfolge der Farbwerte: b,g,r

    Laut msdn berechnet sich die stride-Größe so:

    stride = (biWidth * (biBitCount / 8) + 3) & ~3
    

    Auf Pixel (x,y) kann man dann (wenn biHeight negativ ist) so zugreifen:

    char* pixels=new ...;
    GetDIBits(... &pixels, ...);
    
    char b=(y*stride + x*3 + 0);
    char g=(y*stride + x*3 + 1);
    char r=(y*stride + x*3 + 2);
    

    Zur Stride-Size:
    Bei DIBs müssen die Pixel pro Zeile "DWORD-aligned"-sein, d.h. die Anzahl der Bytes muss durch 4 teilbar sein.
    Wenn man z.B. eine Bitmap hat die 321 Pixel breit ist, kommt man auf 321*3=963 Pixel pro Zeile. Das ist nicht glatt durch 4 teilbar, also wird die Zeile mit 0-Bytes aufgefüllt bis die Anzahl der Bytes pro Zeile durch 4 teilbar ist.
    Das heisst die stride-Size wäre in diesem Falle 964.

    In der msdn gibts dazu auch ein nettes Bildchen:
    http://msdn.microsoft.com/en-us/library/dd407212(VS.85).aspx



  • Ich mache das einfach so:
    - extern ein Bitmap erstellen, z.B. mit Hilfe eines Programmes zur Bildbearbeitung
    - Das so erstellte Bitmap als DLL-Resource bereitstellen (Charles Petzold)
    - Über die DLL das Bitmap im Programm einbinden
    Vielleicht reicht dir das schon.



  • Ich mache das einfach so:
    - extern ein Bitmap erstellen, z.B. mit Hilfe eines Programmes zur Bildbearbeitung

    Das geht ohne probleme

    - Das so erstellte Bitmap als DLL-Resource bereitstellen (Charles Petzold)
    - Über die DLL das Bitmap im Programm einbinden

    Wie machst du das genau als DLL-Recource bereitstellen?
    Ist das kein Umweg das Bild erst zu speichern und dann wieder neu zu laden, einfacher wäre es doch das Bild zu machen und gleich im Programm weiter zu nutzen.



  • Nein, das ist kein grosser Umweg. Eine oder mehrere Bitmaps werden in einer einfachen DLL aus einer Ressource-Datei bereitgestellt und können dann im Programm über die ID problemlos ausgewählt werden. Ist wirklich gut, was Charles Petzold da aufgezeigt hat.



  • Hat jemand ein Beispiel zu diesem Ansatz?



  • Möglichkeit 1: Buch 'Charles Petzold: Windows-Programmierung' lesen, das gewünschte Beispiel (DLL und Anwendung) befindet sich darin.
    Möglichkeit 2: Mir eine email schicken.
    Das Urheberrecht (coyright) eines Buchautors muss gewahrt bleiben!


Anmelden zum Antworten