bitmap
Le
Nicolas aunai
salut
quelqu'un pourrait-il me renseigner un peu sur les bitmap svp ?
il y a quelques choses en effet que j'ai du mal a saisir dans la msdn.
voila ce que je fais :
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
HBITMAP CreateHbitmap(void)
{
HDC hdcscreen,hdcCompatible;
HBITMAP hbmscreen;
hdcscreen=GetDC(NULL);
hdcCompatible=CreateCompatibleDC(hdcscreen);
/*creation du bitmap compatible*/
hbmscreen=CreateCompatibleBitmap( hdcscreen,
GetDeviceCaps(hdcscreen,HORZRES),
GetDeviceCaps(hdcscreen,VERTRES)
);
/*select le bitmap dans le dc compatible*/
SelectObject(hdcCompatible,hbmscreen);
/*capture de l'image*/
BitBlt( hdcCompatible,
hbmscreen,
0,
0,
GetDeviceCaps(hdcscreen,HORZRES),
GetDeviceCaps(hdcscreen,VERTRES),
SRCCOPY
);
return hbmscreen;
}
normalement avec cette fonction j'ai un HBITMAP correspondant a tout mon
écran. ok ?
donc je regarde la doc et je vois :
typedef struct tagBITMAP { // bm
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP;
je vois également dans msdn qu'avant (dans 'storing an image') de créer et
remplir le fichier bmp, ils remplissent la BITMAPINFO structure
je regarde et je vois :
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
donc ça serait cette structure qui contient les données brutes, les pixels
(RGBQUAD), dont j'ai besoin pour faire un fichier jpeg (les rows, ou scan
lines) c'est ça ?
où est-ce que je peux y avoir accès avec mon HBITMAP initial ? si oui
comment ?
merci a vous, si vous pouvez m'éclaircir un peu sur ce sujet.
--
nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@nospam@hotmail.com
quelqu'un pourrait-il me renseigner un peu sur les bitmap svp ?
il y a quelques choses en effet que j'ai du mal a saisir dans la msdn.
voila ce que je fais :
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
HBITMAP CreateHbitmap(void)
{
HDC hdcscreen,hdcCompatible;
HBITMAP hbmscreen;
hdcscreen=GetDC(NULL);
hdcCompatible=CreateCompatibleDC(hdcscreen);
/*creation du bitmap compatible*/
hbmscreen=CreateCompatibleBitmap( hdcscreen,
GetDeviceCaps(hdcscreen,HORZRES),
GetDeviceCaps(hdcscreen,VERTRES)
);
/*select le bitmap dans le dc compatible*/
SelectObject(hdcCompatible,hbmscreen);
/*capture de l'image*/
BitBlt( hdcCompatible,
hbmscreen,
0,
0,
GetDeviceCaps(hdcscreen,HORZRES),
GetDeviceCaps(hdcscreen,VERTRES),
SRCCOPY
);
return hbmscreen;
}
normalement avec cette fonction j'ai un HBITMAP correspondant a tout mon
écran. ok ?
donc je regarde la doc et je vois :
typedef struct tagBITMAP { // bm
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP;
je vois également dans msdn qu'avant (dans 'storing an image') de créer et
remplir le fichier bmp, ils remplissent la BITMAPINFO structure
je regarde et je vois :
typedef struct tagBITMAPINFO { // bmi
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
donc ça serait cette structure qui contient les données brutes, les pixels
(RGBQUAD), dont j'ai besoin pour faire un fichier jpeg (les rows, ou scan
lines) c'est ça ?
où est-ce que je peux y avoir accès avec mon HBITMAP initial ? si oui
comment ?
merci a vous, si vous pouvez m'éclaircir un peu sur ce sujet.
--
nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@nospam@hotmail.com

Poser une question


Bonjour.
<snip>
Ca c'est la structure servant à représenter un bitmap en mémoire, pas sur
disque. Le pointeur bmBits pointe sur les données, mais on ne connait pas
leur format exact (ca dépend du DC).
Ca c'est une représentation (inexacte, car la taille réelle de bmiColors
dépend des données dans bmiHeader) du début d'un fichier .bmp. Voir
l'article "Bitmap Storage" ainsi que la structure BITMAPINFOHEADER dans MSDN
pour une description assez claire du schmilblick.
Pas vraiement, les données brutes sont après le BITMAPINFO dans le fichier.
Le tableau de RGBQUAD (quand il existe) est la table des couleurs du bitmap.
Un HBITMAP ne permet pas d'avoir accès aux bits de l'image brut de fonderie
dans un format connu. Pour cela, il faut créer un DIB (Device Independant
Bitmap) avec GetDIBits, qui convertit les données dans un format
standardisé. Voir l'article "DIBS and their use" pour une explication
détaillée du fonctionnement de cette API. On sauvegarde des DIBS dans les
fichiers .bmp, pas les HBITMAP (car les HBITMAP sont dépendants du DC sur
lequel ils sont représentés).
Tu veux faire quoi exactement avec ta copie d'écran? La sauvegarder en .bmp?
La passer à une librairie qui attend un format particulier?
Arnaud
ok, peux-tu me dire pourquoi ?
je vais regarder !
pas tant que ça malheureusement....
--
nico,
http://astrosurf.com/nicoastro
messenger : @hotmail.com
franchement je patauge grave...
#include #include #include
PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hbm)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;
GetObject(hbm, sizeof(BITMAP), (LPSTR)&bmp);
cClrBits=(WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if(cClrBits==1)
cClrBits=1;
else if(cClrBits<=4)
cClrBits=4;
else if(cClrBits<=8)
cClrBits=8;
else if(cClrBits<)
cClrBits;
else if(cClrBits<$)
cClrBits$;
else
cClrBits2;
if (cClrBits != 24)
pbmi = ( PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * (1<< cClrBits)
);
// There is no RGBQUAD array for the 24-bit-per-pixel format.
else
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits);
pbmi->bmiHeader.biCompression = BI_JPEG;
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31)
& ~31) /8
* pbmi->bmiHeader.biHeight;
pbmi->bmiHeader.biClrImportant = 0;
return pbmi;
}
int main(void)
{
HDC hdcscreen,hdcMem;
HBITMAP hbmscreen,hbmdib;
UINT height,width;
PBITMAPINFO pbmi;
void *pp;
hdcscreen=GetDC(NULL);
hdcMem=CreateCompatibleDC(hdcscreen);
height=GetDeviceCaps(hdcscreen,VERTRES);
width=GetDeviceCaps(hdcscreen,HORZRES);
hbmscreen=CreateCompatibleBitmap( hdcscreen,
height,
width
);
pbmi=CreateBitmapInfoStruct(hbmscreen);
hbmdib=CreateDIBSection(hdcMem,
pbmi,
DIB_RGB_COLORS,
pp,
NULL,
0);
SelectObject(hdcMem,hbmdib);
BitBlt( hdcMem,
0,
0,
width,
height,
hdcscreen,
0,
0,
SRCCOPY);
system("pause");
return 0;
}
si qqn pouvait me donner juste la marche a suivre, avec l'ordre des
fonctions a appeler, pour faire quoi etc.... ça serait sympa... et peut-etre
que ça me sortirai de la mer** dans laquelle je suis !
--
nico,
http://astrosurf.com/nicoastro
messenger : @hotmail.com
Pourtant il fait office de référence dans le domaine, peut-être est-ce
plutôt parce que c'est la programmation Win32 qui est "chiante" (au
moins pour certains)? Si tu veux mon avis (et même si tu le veux pas je
le donne quand même ;) tu cherches à pisser un programme, sans vouloir
comprendre ce qu'il y'a derrière, comment ça fonctionne, comment ça a
été penser, et pourqoi ça fonctionne comme cela... je crois que tu te
fais des illusions sur la facilité d'apprentissage de Win32... ce n'est
pas compliqué, mais ça bouffe du temps. Comprendre la gestion des
bitmap en Win32 m'a pris beaucoup de temps, et je n'en ai pas encore
compris toutes les subtilités, par contre quand tu fouilles un peu, tu
repères évidemment quelques lourdeurs, mais tu vois aussi que ça
fonctionne relativement bien et que c'est très souple... Cherche un
peu, lis de la doc, et peut-être... ne cherche pas à programmer trop
vite ce que tu crois avoir compris.
Concernant la qualité de ton code, pas le courage de détaille, commence
déjà par de demander quand sont libérés tes objets et ta mémoire.
--
Quentin Pouplard (Tene/MyOE)
http://www.myoe.org | http://graff.alrj.org
Bienvenu dans le monde merveilleux de la programmation Windows!
--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/