Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : redimentionnement d'image, aidez-moi svp [ Archives / Au secours ] (sousou_one)

mercredi 20 juillet 2005 à 11:51:37 | redimentionnement d'image, aidez-moi svp

sousou_one

salut à tous,
je veux construire une bitmap par copie d'une région d'une bitmap source, je dois prendre les nouvelles dimensions en sélectionnant la région à copier par la souris mais j'ai pas réussi.
Est ce que quelqu'un peut m'aider?
voilà mon code:


//*****************************************************************************
// DimBmp.cpp :
//
//*****************************************************************************

#include <windows.h>
#include "Resource.h"
#include <iostream>

using namespace std;

//=============================================================================
// Variables globales.
//=============================================================================
HINSTANCE g_hAppInstance = NULL; // instance de l'application
HWND  g_hWndMainFrame = NULL; // fenêtre principale

HBITMAP  g_hBmpSrc  = NULL; // bitmap source
HBITMAP  g_hBmpDst  = NULL; // bitmap destination
long x1, x2, y1, y2;
//=============================================================================
// Fonctions du module.
//=============================================================================
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
SIZE GetBmpSize (HBITMAP hBmp);
HBITMAP RedimBmp (HDC hdc, HBITMAP hBmpScr, RECT rcSrc, SIZE sizeDst);
void DrawBmp  (HDC hdc, int x, int y, HBITMAP hBmp);

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

//*****************************************************************************
// WinMain : point d'entrée du programme.
//*****************************************************************************
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPSTR lpCmdLine, int nCmdShow)
{
 // initialisation de l'application
 if(!InitInstance(hInstance, nCmdShow))
  return 0;

 // boucle de messages
 MSG msg;
 while(GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return msg.wParam;
}

//*****************************************************************************
// InitInstance : initialisation de l'application, création de la fenêtre
//                principale.
//*****************************************************************************
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
 // sauvegarde de l'instance de l'application
 g_hAppInstance = hInstance;
 char szWndClass[] = "DimBmpWnd";
 char szWndTitle[] = "DimBmp";

 // classe de fenêtre
 WNDCLASS wc;
 ZeroMemory(&wc, sizeof(WNDCLASS));
 wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION);
 wc.hCursor   = LoadCursor(NULL, IDC_ARROW);
 wc.hInstance  = g_hAppInstance;
 wc.lpfnWndProc  = WndProc;
 wc.style   = CS_HREDRAW|CS_VREDRAW;
 wc.lpszClassName = szWndClass;
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 if(!RegisterClass(&wc))
  return FALSE;

 // création de la fenêtre
 g_hWndMainFrame = CreateWindow(szWndClass, szWndTitle, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
    NULL, NULL, g_hAppInstance, NULL);
 if(g_hWndMainFrame == NULL)
  return FALSE;

 // affichage
 ShowWindow(g_hWndMainFrame, nCmdShow);
 UpdateWindow(g_hWndMainFrame);
 return TRUE;
}

//*****************************************************************************
// GetBmpSize : récupère la taille d'un bitmap.
// entrée : hBmp : bitmap dont on souhaite récupérer la taille.
// retour : taille du bitmap spécifié.
//*****************************************************************************
SIZE GetBmpSize(HBITMAP hBmp)
{
 // récupération des informations sur le bitmap
 BITMAP bmpInfo;
 GetObject(hBmp, sizeof(bmpInfo), &bmpInfo);

 // taille
 SIZE size;
 size.cx = bmpInfo.bmWidth;
 size.cy = bmpInfo.bmHeight;
 return size;
}

//*****************************************************************************
// RedimBmp : crée un bitmap en recopiant une zone d'un autre bitmap avec un
//            redimensionnement éventuel.
// entrée : hdc     : DC à utiliser pour créer les DCs compatibles (DC de la
//                    fenêtre principale ou de l'écran par exemple).
//          hBmpSrc : bitmap source.
//          rcSrc   : zone du bitmap source à recopier ou {0,0,0,0} pour
//                    recopier l'intégralité.
//          sizeDst : taille du bitmap de destination ou {0,0} pour calculer
//                    la taille à partir de rcSrc (pas de redimensionnement).
// retour : bitmap créé.
//*****************************************************************************
HBITMAP RedimBmp(HDC hdc, HBITMAP hBmpSrc, RECT rcSrc, SIZE sizeDst)
{
 // taille du bitmap initial
 SIZE sizeSrc = GetBmpSize(hBmpSrc);

 // si rcSrc est à {0,0,0,0}, on prend toute l'image source
 if(rcSrc.left==0 && rcSrc.top==0 && rcSrc.right==0 && rcSrc.bottom==0)
 {
  rcSrc.right  = sizeSrc.cx;
  rcSrc.bottom = sizeSrc.cy;
 }
 // vérification des bornes
 if(rcSrc.left < 0)
  rcSrc.left = 0;
 if(rcSrc.top < 0)
  rcSrc.top = 0;
 if(rcSrc.right > sizeSrc.cx)
  rcSrc.right = sizeSrc.cx;
 if(rcSrc.bottom > sizeSrc.cy)
  rcSrc.bottom = sizeSrc.cy;

 // si sizeDst est à {0,0}, on ne fait pas de redimensionnement
 if(sizeDst.cx==0 && sizeDst.cy==0)
 {
  sizeDst.cx = rcSrc.right-rcSrc.left;
  sizeDst.cy = rcSrc.bottom-rcSrc.top;
 }

 //création de DCs compatibles et du bitmap de destination
 HDC hDCSrc = CreateCompatibleDC(hdc);
 HDC hDCDst = CreateCompatibleDC(hdc);
 HBITMAP hBmpDst = CreateCompatibleBitmap(hdc, sizeDst.cx, sizeDst.cy);

 // sélection des bitmaps dans les DCs (avec sauvegarde des anciens)
 HBITMAP hOldBmpSrc = (HBITMAP)SelectObject(hDCSrc, hBmpSrc);
 HBITMAP hOldBmpDst = (HBITMAP)SelectObject(hDCDst, hBmpDst);

 // recopie
 SetStretchBltMode(hDCDst, HALFTONE);
 StretchBlt(hDCDst, 0, 0, sizeDst.cx, sizeDst.cy, hDCSrc,
   rcSrc.left, rcSrc.top,
   rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top, SRCCOPY);

 // sélection des anciens bitmaps dans les DCS
 SelectObject(hDCSrc, hOldBmpSrc);
 SelectObject(hDCDst, hOldBmpDst);

 // destruction des DCs
 DeleteDC(hDCSrc);
 DeleteDC(hDCDst);

 // retour
 return hBmpDst;
}

//*****************************************************************************
// DrawBmp : dessine un bitmap dans un DC.
// entrée : hdc : DC où dessiner le bitmap.
//          x    : coordonnée en x où dessiner le bitmap.
//          y    : coordonnée en y où dessiner le bitmap.
//          hBmp : bitmap à dessiner.
//*****************************************************************************
void DrawBmp(HDC hdc, int x, int y, HBITMAP hBmp)
{
 // création d'un DC compatible pour y sélectionner le bitmap à dessiner
 HDC hDCBmp = CreateCompatibleDC(hdc);
 HBITMAP hOldBmp = (HBITMAP)SelectObject(hDCBmp, hBmp);

 // recopie
 SIZE sizeBmp = GetBmpSize(hBmp);
 BitBlt(hdc, x, y, sizeBmp.cx, sizeBmp.cy, hDCBmp, 0, 0, SRCCOPY);

 // sélection ancien bitmap et destruction du DC
 SelectObject(hDCBmp, hOldBmp);
 DeleteDC(hDCBmp);
}

//*****************************************************************************
// WndProc : procédure de traitement des messages de la fenêtre principale.
//*****************************************************************************

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
      LPPOINT pt1 = new POINT;
   GetCursorPos(pt1);
   x1=pt1->x;
   y1=pt1->y;
   LPPOINT pt2 = new POINT;
   GetCursorPos(pt2);
   x2=pt2->x;
   y2=pt2->y;
   
 // en fonction du message
 switch(uMsg)
 {
 case WM_CREATE :
  {
   // chargement du bitmap, récupération d'une zone avec
   // redimensionnement
  
   g_hBmpSrc = LoadBitmap(g_hAppInstance, MAKEINTRESOURCE(IDB_SPRITE));
   RECT rcSrc = {x1, y1, x2, y2};
   SIZE sizeDst = {abs(x2-x1), abs(y2-y1)};
   HDC hdc = GetDC(hWnd);
   g_hBmpDst = RedimBmp(hdc, g_hBmpSrc, rcSrc, sizeDst);
   ReleaseDC(hWnd, hdc);
   return 0;
  }
 case WM_DESTROY :
  {
   // destruction des bitmaps, fin de l'application
   DeleteObject(g_hBmpSrc);
   DeleteObject(g_hBmpDst);
   PostQuitMessage(0);
   return 0;
  }
 case WM_PAINT :
  {
   // début du dessin
   PAINTSTRUCT ps;
   HDC hdc = BeginPaint(hWnd, &ps);

   // dessin des bitmaps
   DrawBmp(hdc, 0, 0, g_hBmpSrc);
   DrawBmp(hdc, 200, 0, g_hBmpDst);

   // fin du dessin
   EndPaint(hWnd, &ps);
   return 0;
  }
 }

 // traitement par défaut
 return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


mercredi 20 juillet 2005 à 21:44:39 | Re : redimentionnement d'image, aidez-moi svp

lolquivole

Salut,

Ce que tu fais la dans le code n'a pas d'intérêt, on aura pt1=pt2 parce que tu le prends l'un après l'autre; et donc ton bitmap ne sera pas dessiné...

La solution que je te propose, pour la selection, c'est de traiter les messages WM_LBUTTONDOWN et WM_LBUTTONUP: lorsque tu obtiens un message WM_LBUTTONDOWN, tu mets dans une var globale la pos. de la souris, et lorsque il y a WM_LBUTTONUP, tu compares la position de la souris actuelle avec celle de la variable pour créer ton rect, et enfin afficher ton sprite.




Cette discussion est classé dans : hdc, bitmap, hbitmap, rcsrc, sizedst


Répondre à ce message

Sujets en rapport avec ce message

Bitmap [ par zainal ] Salut a vousbon voila, je voudrai afficher une bitmap dans une zone de static et j ai creer ce bout de code qui ne marche pas vous vous en douter !voi Imprimer un bitmap sans MFC ( API Win32 ) [ par bebel6 ] Bonjour à tous tout d'abord !Alors voila le bin'z :J'aimerais pouvoir imprimer une image avec vsiualc 6 sans l'aide des MFC, j'arrive deja à imprimer disparition de mon bitmap. [ par oRTEEZ ] Voila j'ai une fenetre dans lequel je load mon un bitmap al'aide de la fonction suivante. Mon probleme es t que si je passe sur un autre prog mon imag Diaporama d'images bitmaps... le plus simple possible... [ par Druith2 ] Bonjour, je galère depuis le début de la semaine (je suis un neophyte veritable). Je cherche un moyen simple pour créer un diaporama de 12 images bitm need help_API - debutant. [ par JimyRyan ] j'ai cree un progamme qui affiche une image (stoquee dans un fichier .bmp), et une phrase (lu a partir d'un fichier TXT), j'ai deux problemes : une fo SetClipboardData + CF_BITMAP [ par vecchio56 ] J'essaye de mettre un bitmap dans la clipboard, mais vu que je ne sais pas trop comment ca marche les bitmap, je galère un peu. Voila ou j'en suis:HBI Manipulation de Bitmap [ par rogo ] J'ai réaliser une boite de dialogue sur laquelle j'ai inséré deux Pictures de taille différentes :IDC = IDC_Image_1 et IDC_Image_2Type = BitmapStyle = bitmap pixel par pixel [ par Galmiza ] Salut,J'ai besoin d'afficher des images bitmaps pixel par pixel et non via le BitBlt.J'aimerais pouvoir acceder à ce qu'on appelerait la memoire video copier un bloc de bit dans un bitmap [ par Adeon ] salut ! j'aimerai prendre un rectangle de bit d'un bitmap pour le mettre dans un nouvo bitmap.voila mon prog qui ne marche pa :je cree deux DC :HDC hd Surlignage semi transparent dans un Bitmap ? [ par TigWdz ] Bonjour, je voudrais faire du surlignage dans une bitmap. Je m'explique : J'ai une bitmap qui représente du texte, et je veux, à la manière d'un marqu


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.