Image Bitmap langage C

buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012 - 20 janv. 2011 à 17:55
buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012 - 21 janv. 2011 à 10:51
Bonjour, je suis actuellement en train de faire des manipulation sur des fichiers bitmap en langage C. J'utilise les api fournies par windows. Je cherche a créer un fichier bitmap (j'ai reussi), et a donner une valeur a chaque pixel de l'image. J'utilise pour ceci deux boucles. J'ai fait quelques recherche et je tente d'utiliser l'api SetPixel(). Cependant, j'obtiens bien mon fichier bitmap crée mais le contenu est uniquement des pixels noirs. Pourriez vous m'aider svp en me disans ce qu'il faudrait corriger dans mon code: (Voici la partie du code correspondant à cela)

//Declaration des variables
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
int bitmap_dx = largeur;
int bitmap_dy = hauteur;
HANDLE hLogFile;
BITMAPINFO info;
BYTE* memory = 0;
HBITMAP bitmap;
LPDWORD dwBytesWritten;
HDC winDC = NULL;
int i;
int j;
HDC memDC;
HBITMAP hBitmap;


ZeroMemory(&fileHeader, sizeof(BITMAPFILEHEADER));

fileHeader.bfType = 0x4d42; // Nombre magique
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

//Remplissage des headers
infoHeader.biCompression = 0; // BI_RGB;
infoHeader.biXPelsPerMeter = 0;
infoHeader.biYPelsPerMeter = 0;
infoHeader.biSizeImage = 0;
infoHeader.biClrUsed = 0;
infoHeader.biClrImportant = 0;
infoHeader.biSize = sizeof(infoHeader);
infoHeader.biWidth = bitmap_dx;
infoHeader.biHeight = bitmap_dy;
infoHeader.biPlanes = 1;
infoHeader.biBitCount = 24;
infoHeader.biCompression = BI_RGB;

//Creation du fichier bitmap
hBitmap = CreateCompatibleBitmap(memDC, bitmap_dx, bitmap_dy);
hLogFile = CreateFile(
"C:\\Users\\Jonathan\\Documents\\Traitement d'image\\essai.bmp",
GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL);

//Ecriture des header dans le fichier
WriteFile(hLogFile, &fileHeader, sizeof(fileHeader), &dwBytesWritten, NULL);
WriteFile(hLogFile, &infoHeader, sizeof(infoHeader), &dwBytesWritten, NULL);

info.bmiHeader = infoHeader;

memDC = CreateCompatibleDC(winDC);

// Remplissage BMP
//C'est donc ici que j'utilise l'api SetPixel.
for (i = 0; i < bitmap_dx; ++i) {
for (j = 0; j < bitmap_dy; ++j) {
// SetPixel(memDC, i, j, 0x00FF0000); // http://msdn.microsoft.com/en- //us/library/dd183449(v=vs.85).aspx


}
}

BitBlt(memDC, 0, 0, bitmap_dx, bitmap_dy, winDC, 0, 0, SRCCOPY);

bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**) & memory,
0, 0);
SelectObject(memDC, bitmap);
DeleteDC(memDC);
ReleaseDC(NULL, winDC);


Merci d'avance à ceux qui m'aideront
Jonathan.

2 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 janv. 2011 à 21:49
HWND TO BMP FILE (2) (WIN32)
http://www.cppfrance.com/code.aspx?id=11139

ciao...
BruNews, MVP VC++
0
buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012
21 janv. 2011 à 10:51
Salut,
merci beaucoup BruNews pour ta réponse.
J'ai une petite question qui vient se greffer du fait de l'implémentation de ta proposition.
Je souhaiterais que le tableau de RGBQUAD soit alloué dynamiquement.
J'utilise donc malloc en faisant:
RGBQUAD *colors;
colors=(RGBQUAD*)malloc(largeur*hauteur*sizeof(RGBQUAD));

Cependant quand je fais ça, tout compile bien, mais mon image de sortie est très bizarre.

Auriez vous une petite idée?
Merci

Jonathan
0
Rejoignez-nous