begin process at 2012 05 28 21:44:25
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Fichier & Disque

 > 

Comment reduire la taille d'un BMP ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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 ?

SAKingdom

Membre Club
Exemple ici:
http://www.cppfrance.com/codes/IMPRIMEUR-IMAGES-BMP-API_33749.aspx

C++ (@++)

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

Membre Club
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;

    defaultreturn 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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales