Forum: PC-Programmierung 2D Array aus Bitmap Bild


von Alex M. (alex06)


Lesenswert?

Hallo,
bin ein c++ Anfänger und arbeite mit VC++ 6.0.Ich möchte mit VC++ 6.0 
die Grauwerte eines 8-bit grayscale Bitmap Bildes ermitteln und in einem 
2D Array speichern.Ich habe auf dieser Seite gesehen, dass es einen 
ähnlichen Beitrag gibt aber mir ist es immer noch nicht klar wie ich die 
Grauwerte im Array M kriegen kann.ich kriege 4 fehlermeldungen, die ich 
nicht verstehe.
1
#include <windows.h>
2
#include <stdio.h>
3
#include<string.h>
4
#include <iostream>
5
6
using namespace std;
7
void Bitmap2Array(char filename, int** M)
8
{
9
//filename:Path where the bmp file is located
10
char buf[100];
11
char file=strcpy(buf,filename);  //Fehlermeldung hier
12
HDC hdc;
13
// Handle for the Bitmap
14
static HBITMAP hbitmap;
15
//Bitmapobject 
16
BITMAP bm;  
17
RGBQUAD rgbquad;          
18
hbitmap=(HBITMAP)LoadImage(NULL,file,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
19
GetObject(hbitmap,sizeof(bm),&bm); 
20
int Width=bm.bmWidth,Height=bm.bmHeight;
21
int i,j;
22
byte red,green,blue;
23
float gray;
24
for(j=0;j<=Height;j++){
25
for(i=0;i<=Width;i++){
26
COLORREF col=GetPixel(hdc,j,i);
27
// Extract color components (R,G,B)
28
blue=rgbquad.rgbBlue(col);   // Fehlermeldung hier
29
green=rgbquad.rgbGreen(col); // Fehlermeldung hier
30
red=rgbquad.rgbRed(col);     //Fehlermeldung hier
31
// Convert from RGB to gray scale, using
32
gray = 0.3*red + 0.59*green + 0.11*blue;
33
34
//Store the gray values in the array
35
//M[i][j]=            ;
36
}
37
}
38
}
Habe die Funktion "GetDIbits" gelesen weiss aber nicht wie ich sie 
erfolgreich einsetzen kann.
Danke

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> ich kriege 4 fehlermeldungen, die ich nicht verstehe.

WELCHE ?

von Alex M. (alex06)


Lesenswert?

ich kriege wegen folgeneder Zeilen Fehlermeldungen:
1
char file=strcpy(buf,filename);
2
hbitmap=(HBITMAP)LoadImage(NULL,file,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
3
blue=rgbquad.rgbBlue(col);   // Fehlermeldung 
4
green=rgbquad.rgbGreen(col); //  
5
red=rgbquad.rgbRed(col);

C:\VisualC\Bit2Arr\Test.cpp(15) : error C2664: 'strcpy' : Konvertierung 
des Parameters 2 von 'char' in 'const char *' nicht moeglich
        Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp 
erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- 
oder Funktionsformat
C:\VisualC\Bit2Arr\Test.cpp(26) : error C2664: 'LoadImageA' : 
Konvertierung des Parameters 2 von 'char' in 'const char *' nicht 
moeglich
        Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp 
erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- 
oder Funktionsformat
C:\VisualC\Bit2Arr\Test.cpp(40) : error C2064: Ausdruck ergibt keine 
Funktion
C:\VisualC\Bit2Arr\Test.cpp(41) : error C2064: Ausdruck ergibt keine 
Funktion
C:\VisualC\Bit2Arr\Test.cpp(42) : error C2064: Ausdruck ergibt keine 
Funktion

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die erste Fehlermeldung bekommst Du wegen

  char file=strcpy(buf,filename);

Das enthält gleich mehrere Fehler - der Rückgabewert von strcpy ist 
nicht vom Typ char, und das zweite Argument "filename" ist von Dir als 
char deklariert.

Die zweite Fehlermeldung bekommst Du aus exakt demselben Grund - der 
Parameter "file" ist --s.o.-- als char deklariert.

Ein char ist aber genau ein Zeichen.

Dir fehlen wohl ein paar C-Grundlagen.

Literaturhinweis:
Brian Kernighan & Dennis Ritchie - "Programmieren in C", zweite Auflage, 
Hanser-Verlag.

von Karl H. (kbuchegg)


Lesenswert?

Rufus t. Firefly wrote:

> Dir fehlen wohl ein paar C-Grundlagen.

Nicht nur das. Da fehlen auch etliche C++ Grundlagen.
Es gibt in C keinen wirklichen Grund für strings mit
Character Arrays rumzuwurschten. In C++ gibt es dafür
den Datentyp std::string.

> Literaturhinweis:
> Brian Kernighan & Dennis Ritchie - "Programmieren in C", zweite Auflage,
> Hanser-Verlag.

Weiterer Literaturhinweis:
Bjarne Stroustrup - "The C++ Programming Language"
Addison Weslay

Und für die Windows Programmierung wirst du auch Literatur
benötigen. Da hab ich jetzt aber keinen Tip parat.

von Christoph _. (chris)


Lesenswert?

Und wenn du nicht beruflich oder aehnlich dazu gezwungen bist, nimm 
nicht VC++ 6. Dieser Compiler ist dermassen alt, dass du sehr schnell 
auf Bugs und Verletzungen des C++-Standards stossen wirst die dich nur 
aufhalten werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.