Accueil > Forum > > > > Comment reduire la taille d'un BMP ?
Comment reduire la taille d'un BMP ?
samedi 7 juillet 2007 à 17:23:11 |
Comment reduire la taille d'un BMP ?

Mamelook
|
Comment peut t-on reduire la taille d'une image BMP (HBITMAP) ? J'ai entendu parler de la fonction StretchBlt() de l'api windows, mais je voit pas comment on peut faire sa, pouvez vous m'aider ?
|
|
samedi 7 juillet 2007 à 17:29:24 |
Re : Comment reduire la taille d'un BMP ?
|
samedi 7 juillet 2007 à 19:10:07 |
Re : Comment reduire la taille d'un BMP ?

Mamelook
|
Dsl mais ji arrive vraiment pas, se que je voudrai faire c'est que cette fonction (que j'ai prit sur une source de ce site [je sai plus laquel]) puissent retourner une image redimentionner :
BITMAPFILEHEADER m_BitmapFileHeader; // Données de la structure BITMAPFILEHEADER du Bitmap
PBITMAPINFOHEADER m_pBitmapInfoHeader; // Pointeur sur la structure BITMAPINFOHEADER du Bitmap
PBITMAPINFO m_pBitmapInfo; // Pointeur sur la structure BITMAPINFO du Bitmap
LPBYTE m_pBitmapData; // Pointeur sur les Data du Bitmap
HDC m_hDcBitmap; // Handle sur le hDc du Bitmap en memoire
HBITMAP m_hBitmap; // Handle sur le Bitmap
bool TakeDesktopSnapshot(void)
{
// Récupération du HWND et du HDC du bureau
HWND hWndWindow = GetDesktopWindow();
HDC hDcWindow = GetWindowDC(hWndWindow);
// On récupére les dimensions du bureau
int ScreenX = GetDeviceCaps(hDcWindow, HORZRES);
int ScreenY = GetDeviceCaps(hDcWindow, VERTRES);
// Création d'un contexte mémoire
m_hDcBitmap = CreateCompatibleDC(hDcWindow);
if(!m_hDcBitmap) return 0;
// On crée un bitmap en mémoire ayant les dimensions du bureau
HBITMAP hBitmap = CreateCompatibleBitmap(hDcWindow, ScreenX, ScreenY);
if(!hBitmap) return 0;
// On sélectionne ce bitmap dans le contexte mémoire
if(!SelectObject(m_hDcBitmap, hBitmap)) return 0;
// On effectue une copie du contexte écran vers le contexte mémoire
if(!BitBlt(m_hDcBitmap, 0, 0, ScreenX, ScreenY, hDcWindow, 0, 0, SRCCOPY)) return 0;
// Maintenant on crée la structure BITMAPINFO
BITMAP Bitmap;
WORD Couleur;
// Récupération de la structure BITMAP
if (!GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap)) return 0;
// Convertie le format de couleur
Couleur = (WORD)(Bitmap.bmPlanes * Bitmap.bmBitsPixel);
if (Couleur == 1) Couleur = 1;
else if (Couleur <= 4) Couleur = 4;
else if (Couleur <= 8) Couleur = 8;
else if (Couleur <= 16) Couleur = 16;
else if (Couleur <= 24) Couleur = 24;
else Couleur = 32;
// Alloue de la memoire pour la structure BITMAPINFO (Cette structure
// contient une structure BITMAPINFOHEADER et un tableau de RGBQUAD
if (Couleur != 24)
m_pBitmapInfo = (PBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<< Couleur)];
// Il n'y a pas de tableau de RGBQUAD pour le format 24 bit
else
m_pBitmapInfo = (PBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER)];
if(!m_pBitmapInfo) return 0;
// Initialise la structure BITMAPINFO
m_pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_pBitmapInfo->bmiHeader.biWidth = Bitmap.bmWidth;
m_pBitmapInfo->bmiHeader.biHeight = Bitmap.bmHeight;
m_pBitmapInfo->bmiHeader.biPlanes = Bitmap.bmPlanes;
m_pBitmapInfo->bmiHeader.biBitCount = Bitmap.bmBitsPixel;
if (Couleur < 24)
m_pBitmapInfo->bmiHeader.biClrUsed = (1<bmiHeader.biCompression = BI_RGB;
m_pBitmapInfo->bmiHeader.biSizeImage = ((m_pBitmapInfo->bmiHeader.biWidth * Couleur +31) & ~31) /8 * m_pBitmapInfo->bmiHeader.biHeight;
// Set biClrImportant to 0, indicating that all of the
// device colors are important.
m_pBitmapInfo->bmiHeader.biClrImportant = 0;
//initialise le reste des structures...
m_pBitmapInfoHeader = (PBITMAPINFOHEADER) m_pBitmapInfo;
m_pBitmapData = new BYTE[m_pBitmapInfoHeader->biSizeImage];
if (!m_pBitmapData) return 0;
// Retrieve the color table (RGBQUAD array) and the bits
// (array of palette indices) from the DIB.
if (!GetDIBits(m_hDcBitmap, hBitmap, 0, (WORD) m_pBitmapInfoHeader->biHeight, m_pBitmapData, m_pBitmapInfo, DIB_RGB_COLORS)) return 0;
m_BitmapFileHeader.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
m_BitmapFileHeader.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + m_pBitmapInfoHeader->biSize + m_pBitmapInfoHeader->biClrUsed * sizeof(RGBQUAD) + m_pBitmapInfoHeader->biSizeImage);
m_BitmapFileHeader.bfReserved1 = 0;
m_BitmapFileHeader.bfReserved2 = 0;
// Compute the offset to the array of color indices.
m_BitmapFileHeader.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + m_pBitmapInfoHeader->biSize + m_pBitmapInfoHeader->biClrUsed * sizeof (RGBQUAD);
return 1;
}
Comment faire ?
|
|
samedi 7 juillet 2007 à 20:47:43 |
Re : Comment reduire la taille d'un BMP ?

luhtor
|
Pk tu tiens absolument à bouffer du bmp ? Ya plein de petites librairies (ou grosse) pour lire un bmp. Tu en obtiens alors facilement le buffer de données. Tu le redimensionnes et tu utilises de nouveau la librairie pour sauvegarder le nouveau bmp.
|
|
samedi 7 juillet 2007 à 21:12:44 |
Re : Comment reduire la taille d'un BMP ?

Mamelook
|
Et bien, les librairy que j'ai vue sont bien trop lourde (plus de 100ko), j'ai un cahier des charges a respecter, donc pour l'instan c'est a bannir ...
|
|
samedi 7 juillet 2007 à 22:07:39 |
Re : Comment reduire la taille d'un BMP ?

SAKingdom
|
LoadImage SelectObject du HBITMAP retourné sur un DC mémoire créé avec CreateCompatibleDC StretchBlt sur DC principal récupéré avec GetDC et le tour est joué. Voici un exemple complet. L'image IMAGE_NAME est redimensionné selon les dimensions de la fenêtre: #include <windows.h>
#define IMAGE_NAME "sak.bmp"
HBITMAP hBmp;
BITMAP bmp;
HDC hDC, hMemDC; int w = 0, h = 0;
LRESULT __stdcall WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message) {
case WM_CREATE: {
hDC = GetDC(hwnd);
hMemDC = CreateCompatibleDC(hDC);
hBmp = LoadImage(0, IMAGE_NAME, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SelectObject(hMemDC, hBmp);
GetObject(hBmp, sizeof(bmp), &bmp);
} break;
case WM_SIZE:
w = LOWORD(lParam);
h = HIWORD(lParam);
StretchBlt(hDC, 0, 0, w, h, hMemDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
break;
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
StretchBlt(hdc, 0, 0, w, h, hMemDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
EndPaint(hwnd, &ps);
} break;
case WM_DESTROY:
ReleaseDC(hwnd, hDC);
DeleteDC(hMemDC);
PostQuitMessage(0);
break;
default: return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmd, int scmd)
{
HWND hwnd;
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0; wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0; wcex.hIconSm = 0;
wcex.hCursor = LoadCursor(0, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wcex.lpszMenuName = 0;
wcex.lpszClassName = "RedimBmp";
if(RegisterClassEx(&wcex)) {
if(hwnd = CreateWindow("RedimBmp", "RedimBmp", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0)) {
MSG msg;
ShowWindow(hwnd, SW_NORMAL);
while(GetMessage(&msg, 0, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return 0;
}
Coloration réalisé avec CodeFormatter
C++ (@++)
|
|
samedi 7 juillet 2007 à 22:08:01 |
Re : Comment reduire la taille d'un BMP ?

luhtor
|
Oue peut etre, mais une source comme celle-ci pèse pas 100ko et peut simplifier la vie. http://www.cppfrance.com/codes/LOADER-BMP-TRAITEMENT_33150.aspx
Apres, c'est toi qui vois :)
|
|
dimanche 8 juillet 2007 à 02:40:52 |
Re : Comment reduire la taille d'un BMP ?

Mamelook
|
Merci pour vos réponse, je vien de trouver la source qui me fallai !
http://www.cppfrance.com/codes_image/normal/20758.aspx
La taille de l'image generer est tres faible, mais c'est la qualiter qui me gene, quelqu'un serait comment faire pour augmenter la qualiter ?
|
|
Cette discussion est classée dans : taille, bmp, reduire
Répondre à ce message
Sujets en rapport avec ce message
HeapRealloc() pour reduire un bloc [ par thiosyiasar ]
J'ai un souci avec une réallocation d'un bloc mémoire dans le tas par défautA savoir que tant que je réalloue un bloc plus grand ca marche!Par contre
reduire la taille du .exe [ par Rei91 ]
Bonjour, je voudrais savoir si ya pas une autre solution qu'une compression avec UPX pour réduire la taille des exe produit pas devc++. Car pour un si
reduire la taille d'une image lors de l'acquisition [ par lima_81 ]
Bonjour,je developpe une application sous builder c++ en utilisant la webcam, mon probleme est comment reduire la taille des images lors de l'acquisit
reduire un bmp [ par cheby ]
salut a tousvoila je suis debutante en C et j'aurais besoin d'un petit coup de mainil faudrait que je redimmensionne un bmp en Cest ce que quelqu'un p
Reduire la taille d'une dll [ par jb212121 ]
Bonjour,Comment faire pour réduire la taille d'une dll, car j'ai seulement 5 lignes de code dedans et ma dll fait 197ko.Si je compile avec l'option op
taille d'un bmp [ par kuroro ]
Bonjours , j'aimerai savoir si il existe un trucmachinchoz pour pouvoir recuperer la taille d'un bmp en pixel , salut .
Afficher une partie de l'image BMP [ par faizazouari ]
Salut. J'ai rencontrée un problème lors l'affichage d'une partie de l'image original(bmp) de résolution 480x640.Je veux Afficher uniquement une partie
Comment savoir la taille x*y d'un fichier bmp [ par EricLeRouge ]
J'aimerai savoir la hauteur et la largeur d'un bmp à partir de son chemin, sans avoir à l'ouvrir.ps: j'utilise allegro, permet il de le faire?Merci.
Tableau de grande taille [ par LuckyNut ]
Slut,J'ai un problème pour créer un tableau de grande taille à 2 dimensions : int tab[100][62000];Le programme plante sur un "stack overflow"Cette var
pb d'allocation memoire pour des tableaux char [ par kollibar ]
bonjour, j ai un pb sur le code suivant(imprime le handle et le nom de toutes les fenetres active a l'écran) au niveau des variables char * titre et c
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|