GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 10 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Arnaud Debaene
Le #9702711
Nicolas aunai wrote:
salut


Bonjour.

<snip>
typedef struct tagBITMAP { // bm
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP;



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).

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;


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.

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 ?


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.

où est-ce que je peux y avoir accès avec mon HBITMAP initial ? si oui
comment ?



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
Nicolas aunai
Le #9702701
Christian ASTOR a écrit:

Non, pas Ok. Ce morceau de code est tout pourri :-(



ok, peux-tu me dire pourquoi ?

Il faudrait lire le Petzold où toutes les bases sur DDB & DIB sont
expliquées.



je vais regarder !


Non, mais c'est pourtant clair



pas tant que ça malheureusement....

ds ce même article ("storing an
image") : GetDIBits() (+ vielle KB Q80080 qui reprend la même chose)





--
nico,
http://astrosurf.com/nicoastro
messenger : @hotmail.com
Nicolas aunai
Le #9702661
bon j'ai refais un autre bout de code, est-il tout pourri aussi ?
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
Quentin Pouplard
Le #9702651
Nicolas aunai wrote:
décidément le Petzold est bien l'un des bouquins les plus chiant qu'il
m'ait été donné de lire... non seulement j'y comprend pas grand chose,
mais les codes exemples font 3km de long, et c super pas motivant !



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
Emmanuel Delahaye
Le #9702641
In 'fr.comp.os.ms-windows.programmation', "Nicolas aunai"

décidément le Petzold est bien l'un des bouquins les plus chiant qu'il
m'ait été donné de lire... non seulement j'y comprend pas grand chose,
mais les codes exemples font 3km de long, et c super pas motivant !



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/
Publicité
Suivre les réponses
Poster une réponse
Anonyme