Bonjour,
je suis débutant en c++ et programme avec visual C++ 6.0 sous WinXP.J'essaie en vain depuis 2 semaines de stocker une image Bitmap(8 bit avec niveau de gris) dans un tableau à deux dimensions.Pour ce faire je n'utilise pas de MFC mais plutôt Win32 API.Quelq'un pourrait-il me donner des astuces par rapport à mon code car j'ai des erreurs dans mon code au niveau de :
BYTE tempScanLine[WIDTH * 1] :
error C2057: should be a constant expression
expression
error C2466 : can't reserved an array of size 0
error C2133: 'tempScanLine' : unknown parameter
erreur au niveau de:
const double grayscale[WIDTH*HEIGHT];
error C2133: 'grayscale' : unknown parameter
J'ai regardé dans MSDN la signification de ces erreurs et ne parvient toujours pas à les corriger.Voici mon code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <windows.h>
#include <stdio.h>
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static CHAR szAppName[] ="Salut" ;
     HWND         hwnd;
     MSG          msg ;
     WNDCLASS     wndclass ;
 
 
	 wndclass.style         = NULL;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
 
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("Problème!"),szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     hwnd = CreateWindow (szAppName,                  // nom de la classe
                          "Cube",		  // titre de la fenêtre
                           WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
									| WS_MINIMIZEBOX | WS_VISIBLE    ,   // style de la fenêtre
                          CW_USEDEFAULT,              // position initiale en x
                          CW_USEDEFAULT,              // position initiale en y
                          350,						  // largeur initiale
                          350,						  // hauteur initiale
                          NULL,                       // handle de la fenêtre mère
                          NULL,                       // handle du menu de la fenêtre
                          hInstance,                  // handle de l'instance
                          NULL) ;                     // paramètres de création
 
 
 
     ShowWindow (hwnd, iCmdShow) ;
 
     UpdateWindow (hwnd);
 
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{	
static HBITMAP hbitmap;
int WIDTH, HEIGHT;
switch (message)
     {
   case WM_PAINT:
 
HANDLE hObj = LoadImage(NULL,"cube.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
HDC hdc = CreateCompatibleDC(NULL);
SelectObject(hdc, hObj);
BITMAPINFO bInfo;
bInfo.bmiHeader.biSize = sizeof(bInfo.bmiHeader);
bInfo.bmiHeader.biWidth = WIDTH;
bInfo.bmiHeader.biHeight = HEIGHT;
bInfo.bmiHeader.biPlanes = 1;
bInfo.bmiHeader.biBitCount = 8; 
bInfo.bmiHeader.biCompression = BI_RGB;
BYTE tempScanLine[WIDTH ];
BYTE info[HEIGHT][WIDTH];
 
ZeroMemory(&bInfo, sizeof(BITMAPINFO));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
int count = HEIGHT - 1;
const double grayscale[WIDTH*HEIGHT];
for(int j = 0; j < HEIGHT; ++j)
{
      // find the width of the object
      GetDIBits(hdc, (HBITMAP) hObj, j, 1, NULL, &bi, DIB_RGB_COLORS);
 
      // store the color values in a 3D array of bytes
      GetDIBits(hdc, (HBITMAP) hObj, j, 1, tempScanLine, &bInfo, DIB_RGB_COLORS);
      for(int z = 0; z < bi.bmiHeader.biWidth; ++z)
      {
            info[count][z][0] = tempScanLine[(z * 1) + 2];    
            info[count][z][1] = tempScanLine[(z * 1) + 1];     
            info[count][z][2] = tempScanLine[(z * 1) + 0];                   
          //Transform to gray values
            grayscale[z]=info[count][z][0]*0.299 + info[count][z][1]*0.587+info[count][z][2]*0.114;
      }
     --count;
}
break;
     case WM_DESTROY:
     DeleteObject(hbitmap);	
      PostQuitMessage (0) ;
         return 0 ;
	  }
    return DefWindowProc (hwnd, message, wParam, lParam);
}
j'aimerai retourner le tableau grayscale et ne sais pas comment faire à ce niveau....ou peut être dois je calculer le tableau grayscale dans la fonction
WinMain?
Merci