Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

1

09.04.2004, 13:01

Rotanteil aus einer 24bit Bitmap auslesen

Ich möchte aus einer 24bit Bitmap den Rotanteil in ein Array speichern. Mit der Funktion die ich benütze sieht das Array aber so aus, das der erste Pixel 253 Rotanteil hat und alle folgenden 0, obwohl dies auf das Bild das ich lade überhaupt nicht zutrifft.

Und ich komme einfach nicht dahinter woran das liegen könnte :crying:

Hier mal die Funktion:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
result LoadBitmapToArray(const char *Bitmap)
{
    UCHAR            *Bild;        //Speichert die BMP Bilddaten
    HANDLE           Bitmap;       //Handle auf die BMP Datei
    BITMAPFILEHEADER BMPFileHead;  //BMP Datei Header
    BITMAPINFOHEADER BMPFileInfo;  //BMP Datei Info Header
    DWORD            LeseSpeicher; //Zwischenspeicher
    BYTE             *RedData;     //Rotanteil der Bitmap
    int              ArrayWidth;   //Breite des Rotanteilarrays
    int              ArrayHieght;  //Höhe des Rotanteilarrays

    //BMP Datei öffnen
    Bitmap = CreateFile(Bitmap, GENERIC_READ, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);

    if(Bitmap == INVALID_HANDLE_VALUE)
    {
        MSGERR(D3DWindow, "Fehler beim öffnen der Bitmap");
        return R_ERROR;
    }

    //BMP Header einlesen
    if(!ReadFile(Bitmap, &BMPFileHead, sizeof(BMPFileHead), &LeseSpeicher, NULL))
    {
        MSGERR(D3DWindow, "Fehler beim lesen des Bitmap-Kopfs");
        CloseHandle(Bitmap);
        return R_ERROR;
    }

    //BMP Info Header einlesen
    if(!ReadFile(Bitmap, &BMPFileInfo, sizeof(BMPFileInfo), &LeseSpeicher, NULL))
    {
        MSGERR(D3DWindow, "Fehler beim lesen der Bitmap-Informationen");
        CloseHandle(Bitmap);
        return R_ERROR;
    }

    //Hat das Bitmap das gewünschte Format?
    if(BMPFileInfo.biBitCount != 24)
    {
        MSGERR(D3DWindow, "Die Farbtiefe der Bitmap ist nicht 24-bit");
        CloseHandle(Bitmap);
        return R_ERROR;
    }

    //Höhe und Breite des Bitmaps auslesen
    ArrayWidth = BMPFileInfo.biWidth;
    ArrayHeight = BMPFileInfo.biHeight;

    //Speicher dynamisch bereitstellen
    Bild = (UCHAR*)malloc(BMPFileInfo.biSizeImage);

    if(!Bild)
    {
        MSGERR(D3DWindow, "Der Speicher für die Bitmapdaten konnte nicht bereitgestellt werden");
        CloseHandle(Bitmap);
        return R_ERROR;
    }

    //Liest die eigentlichen Bilddaten des BMP
    if(!ReadFile(Bitmap, Bild, BMPFileInfo.biSizeImage, &LeseSpeicher, NULL))
    {
        MSGERR(D3DWindow, "Fehler beim lesen der Bitmap");
        CloseHandle(Bitmap);
        return R_ERROR;
    }

    //Schliesse die Datei wieder
    CloseHandle(Bitmap);

    //Speicher für Bitmapdaten bereitstellen
    RedData = (BYTE*)malloc(BMPFileInfo.biSizeImage/3);

    //Rotanteil ins Array laden
    for(int y=0; y<ArrayHeight; y++)
    {
        for(int x=0; x<ArrayWidth; x++)
        {
            //Herausfiltern des Rotanteils
            UCHAR rot = Bild[((ArrayHeight-y)*ArrayWidth + x)*3 + 2];
            RedData[x + (y*ArrayWidth)] = (BYTE)rot;
        }
    }

    //Speicher freigeben
    if(Bild)
        free(Bild);

    return R_OK;
}


Ich hoffe irgendjemand wird schlau daraus und kann mir helfen. Wahrscheindlich ist es wieder so ein dummer Fehler, nach dessen Auflösung ich mir wieder mal den Kopf an die Wand hauen werde :wall:
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

10.04.2004, 18:46

Kann mir denn niemand helfen :crying:

Ich kann an meinem Programm nicht weiterschreiben wenn ich diese Funktion nicht hinbekommen.

Stellt euch vor ich bin schon seit fast einer Woche auf Programmierentzug. Ich fang schon an am ganzen Körper zu Zittern und ab und zu zucken meine Augen so komisch. ;D

Ne, jetzt mal im ernst:

Wenn die Fragestellung unklar ist dann wäre ich froh wenn mir das jemand mitteilen könnte.
Oder wenn jemand einen anderen Ansatz hat, die Rotanteile auszulesen wäre auch schön.

:huhu:
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

3

10.04.2004, 21:01

Ich denke, da musst Du durchdebuggen.

Kann es sein, dass Du statt Rot eine andere Komponente erwischt, d.h. dass das diese Komponente im 1. Pixel den Wert 253 und die anderen 0 haben?

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

4

10.04.2004, 23:27

nöö, die anderen Farbkomponenten haben auch andere Werte.

Aber danke das mal jemand versucht mir zu helfen.

Oder kennt ihr andere Lösungsvorschläge, wie man dieses Problem lösen könnte, denn es gibt bestimmt noch mindestens 5 andere Möglichkeiten. Leider kenne ich aber nur die eine.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Anonymous

unregistriert

5

11.04.2004, 00:30

Re: Rotanteil aus einer 24bit Bitmap auslesen

BITMAPINFOHEADER eine Variable hat namens
DWORD biCompression, vielleicht ist dein Bitmap komprimiert,

oder :

BITMAPFILEHEADER
"bfOffBits
Specifies the offset, in bytes, from the BITMAPFILEHEADER structure to the bitmap bits. "

schau mal bei MS im MSDN nach

ansonsten fällt mir auch nix ein,
hab mir den Code mal stückchen für stückchen angesehen :(

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

6

11.04.2004, 09:36

Danke. Komprimiert ist sie nicht, aber ich werde mir das andere mal anschauen.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

7

11.04.2004, 14:22

Ich glaube so wird das nichts :crying:. Ich komme nicht auf den Fehler!

Ich verwerf den Ansatz also mal und frage euch nun:

Wie lest ihr Bitmaps ein (mit welchen Funktionen)? Dann versuch ichs mal so, denn irgendwie muss das ja zu lösen sein, aber mit den Funktionen, die ich verwende, krieg ichs nicht hin. :-(
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

8

11.04.2004, 18:15

Ich verwende einfach LoadImage. Die ist für DIB und BMP Dateien bestens und man brauch nicht alles neu zu machen. Mit GetObject bekomm ich dann alle nötigen Informationen und kann dann mit GetPixel das gewünschte Pixel (an xy) erfragen. Dann den Rotanteil auszulesen ist keine Kunst mehr.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

9

11.04.2004, 19:17

Vielen Dank.

Versuch ich gleich mal! :huhu:
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

big_muff

Alter Hase

  • »big_muff« ist der Autor dieses Themas

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

10

12.04.2004, 15:17

Habe ich gemacht! Die Lösung ist aber immer noch nicht befriedigend, dafür ist die Funktion schlanker geworden und benötigt weniger Varaiblen ;)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
result LoadBitmapToArray(const char *Bitmap) 
{ 
   HBITMAP          hBitmap;
   DIBSECTION       DibSection;
   BYTE             *RedData;
   int              ArrayWidth;
   int              ArrayHeight;

    hBitmap = (HBITMAP)LoadImage(0, Bitmap, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

    if(hBitmap==NULL)
    {
        MSGERR(D3DWindow, "Fehler beim laden der Bitmap");
        return R_ERROR;
    }

    if(GetObject(hBitmap, sizeof(DIBSECTION), &DibSection)==0)
    {
        MSGERR(D3DWindow, "Fehler beim erzeugen des Bitmap-Objekts");
        return R_ERROR;
    }

    if(DibSection.dsBm.bmBitsPixel!=24)
    {
        MSGERR(D3DWindow, "Die Farbtiefe der Bitmap ist nicht 24bit");
        return R_ERROR;
    }

    //Höhe und Breite speichern
    ArrayWidth  = DibSection.dsBm.bmWidth;
    ArrayHeight = DibSection.dsBm.bmHeight;

    //Speicher für Rotanteildaten bereitstellen
    RedData = (BYTE*)malloc(ArrayHeight*ArrayWidth*sizeof(BYTE));

    for(int y=0; y<ArrayHeight; y++)
    {
        for(int x=0; x<ArrayWidth; x++)
        {
            RedData[(y*ArrayWidth)+x]=GetRValue(GetPixel((HDC)hBitmap, x, y));
        }
    }

    return R_OK;
}


Der Fehler den es jetzt hat sieht so aus:

Sowohl Rot-, als auch Grün- und Blauanteile sind immer 255.

Weiss irgendjemand woran das liegen könnte?
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Werbeanzeige