Est-ce que quelqu'un pourrait m'envoyer une bitmap 8bits ?

Est-ce que quelqu'un pourrait m'envoyer une bitmap 8bits ? - C++ - Programmation

Marsh Posté le 26-07-2004 à 13:07:42    

:hello:
 
Bon désolé pour la question étrange, mais je vais tacher d'expliquer mon problème...
 
Je me suis fait une fonction permettant de lire une image bitmap et de l'afficher avec le GDI, mais j'ai un ptit problème avec... En effet, je suis censé pouvoir lire et afficher les images bitmaps 8 bits, et j'y arrive, mais pas avec des images que je fais moi meme ! :/ Je m'explique... Si je prends une bitmap 8 bits présente dans le répertoire de windows ca marche, mais si je me fais une image 8 bits (non compréssée) avec paint ou photoshop, mon image s'affiche soit très mal, soit pas du tout... :/ Comme si elle n'etait pas enregistrée de la meme facon, et que la palette ne se trouvait pas au meme endroit...
 
Je voulais donc savoir si quelqu'un pouvait m'envoyer une image bitmap 8 bits de sa création en me précisant le logiciel utilisé et son OS, pour essayer de voir où est le problème de mon coté...
 
Mercÿte :jap:

Reply

Marsh Posté le 26-07-2004 à 13:07:42   

Reply

Marsh Posté le 26-07-2004 à 14:26:18    

Tu veux dire une .BMP ? Avec quoi tu la lis ? Quelle dimension ont celle qui plantent ? (largeur x hauteur)

Reply

Marsh Posté le 26-07-2004 à 14:34:28    

Je la lis avec cette fonction : (depuis une ressource)

Code :
  1. //Là c'est la methode appellée par le constructeur
  2. BOOL Bitmap::Create(HDC hDC, UINT uiResID, HINSTANCE hInstance)
  3. {
  4.   // Free any previous DIB info
  5.   Free();
  6.   // Find the bitmap resource
  7.   HRSRC hResInfo = FindResource(hInstance, MAKEINTRESOURCE(uiResID), RT_BITMAP);
  8.   if (hResInfo == NULL)
  9.     return FALSE;
  10.   // Load the bitmap resource
  11.   HGLOBAL hMemBitmap = LoadResource(hInstance, hResInfo);
  12.   if (hMemBitmap == NULL)
  13.     return FALSE;
  14.   // Lock the resource and access the entire bitmap image
  15.   PBYTE pBitmapImage = (BYTE*)LockResource(hMemBitmap);
  16.   if (pBitmapImage == NULL)
  17.   {
  18.     FreeResource(hMemBitmap);
  19.     return FALSE;
  20.   }
  21.   // Store the width and height of the bitmap
  22.   BITMAPINFO* pBitmapInfo = (BITMAPINFO*)pBitmapImage;
  23.   m_iWidth = (int)pBitmapInfo->bmiHeader.biWidth;
  24.   m_iHeight = (int)pBitmapInfo->bmiHeader.biHeight;
  25.   // Get a handle to the bitmap and copy the image bits
  26.   PBYTE pBitmapBits;
  27.   m_hBitmap = CreateDIBSection(hDC, pBitmapInfo, DIB_RGB_COLORS,
  28.     (PVOID*)&pBitmapBits, NULL, 0);
  29.   if ((m_hBitmap != NULL) && (pBitmapBits != NULL))
  30.   {
  31.     const PBYTE pTempBits = pBitmapImage + pBitmapInfo->bmiHeader.biSize +
  32.       pBitmapInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD);
  33.     CopyMemory(pBitmapBits, pTempBits, pBitmapInfo->bmiHeader.biSizeImage);
  34.     // Unlock and free the bitmap graphics object
  35.     UnlockResource(hMemBitmap);
  36.     FreeResource(hMemBitmap);
  37.     return TRUE;
  38.   }
  39.   // Something went wrong, so cleanup everything
  40.   UnlockResource(hMemBitmap);
  41.   FreeResource(hMemBitmap);
  42.   Free();
  43.   return FALSE;
  44. }


 
Et ensuite je la dessine avec celle ci :

Code :
  1. void Bitmap::Draw(HDC hDC, int x, int y, BOOL bTrans, COLORREF crTransColor)
  2. {
  3.   if (m_hBitmap != NULL)
  4.   {
  5.     // Create a memory device context for the bitmap
  6.     HDC hMemDC = CreateCompatibleDC(hDC);
  7.     // Select the bitmap into the device context
  8.     HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, m_hBitmap);
  9.     // Draw the bitmap to the destination device context
  10.     if (bTrans)
  11.       TransparentBlt(hDC, x, y, GetWidth(), GetHeight(), hMemDC, 0, 0,
  12.         GetWidth(), GetHeight(), crTransColor);
  13.     else
  14.       BitBlt(hDC, x, y, GetWidth(), GetHeight(), hMemDC, 0, 0, SRCCOPY);
  15.     // Restore and delete the memory device context
  16.     SelectObject(hMemDC, hOldBitmap);
  17.     DeleteDC(hMemDC);
  18.   }
  19. }


Et ca marche très bien pour toutes les zimages bmp 8 bits de windows, mais pas les mienne... Et il suffit par exemple que j'ouvre la bitmap avec paint, que je fasse une modif d'un pixel et que je save et hop ca ne marche plus... :/

Reply

Marsh Posté le 26-07-2004 à 15:30:49    

je dirais un classique pb d'alignement sur DWORD des BMP.
 
ton pTempbits, aligne le sur 4 octets en faisant un:
pTempbits = (pTempbits+3)&(~3);
pour voir comme ça...

Reply

Marsh Posté le 26-07-2004 à 15:31:24    

He bien aucune idée. Je pensais que ça plantait sur des images dont la largeur n'était pas un multiple de 4, mais si tu ne modifies qu'un pixel et que ça plante je ne vois vraiment pas d'où ça vient.

Reply

Marsh Posté le 26-07-2004 à 16:02:16    

bin je pense comme toi youdontcare, ptet que l'alignement bouge après la sauvegarde avec paint :/

Reply

Marsh Posté le 26-07-2004 à 16:18:44    

L'alignement dépend de la taille, si elle ne change pas il ne change pas.  
 
Peut-être un changement de 8b -> 24b fait par paint alors ?

Reply

Marsh Posté le 26-07-2004 à 16:39:54    

Compare les headers de tes propres images et celle qui fonctionnent, tu trouveras peut être.  
Peut être une histoire de longueur de champ, de version de headers (il y en a plusieurs pour le bmp ?), de palette...


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 26-07-2004 à 16:40:15    

Pourtant non si je regarde les propriétés de l'image elle est toujours en 8 bits... Mais sinon j'ai aussi le problème avec photoshop... :/
 
Donc soit je suis vraiment polio et pas capable de faire une bitmap 256 couleurs, soit ya un problème avec les bitmap sur mon PC... :(
 
Parcequ'en fait au debut je pensais que c'etait mon code qui ne marchait pas mais en fait j'ai remarqué qu'il marchait avec les bitmaps qui n'etait pas de ma création... :/

Reply

Marsh Posté le 26-07-2004 à 22:08:49    

Certains logiciels remplissent mal le header. J'en ai fait les frais l'an dernier >.< Blinde bien ton code pr tester TOUT les cas bidons qui peuvent se produrie et tu trouveras l'erreur.


Message édité par Joel F le 26-07-2004 à 22:09:27
Reply

Marsh Posté le 26-07-2004 à 22:08:49   

Reply

Marsh Posté le 26-07-2004 à 22:37:25    

Effectivement, il arrive que les champs de l'entete du bitmap soient quasi tous nuls et donc non significatif. Les champs de type taille et profondeur sont les mieux renseignés.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 27-07-2004 à 11:31:55    

Ok d'accord merci pour les infos... :jap: Bon de toute facon je dois abandonner les bitmaps pour un truc plus leger et plusse beau, donc je ne vais pas trop m'attarder là dessus... :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed