VB - Conversion Bitmap 32 en 24 bit. [Résolu]

Messages postés
3
Date d'inscription
vendredi 25 avril 2008
Dernière intervention
19 janvier 2011
- - Dernière réponse : Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 oct. 2010 à 15:52
Bonjour,

je cherche à convertir une image bitmap 32bit vers le format 24Bit.
on va dire que ça fonctionne. mais pas à tous les coups...
des fois, mon image 24 bit est déformée. ( un peu en biais. )

voici le code :
Private Type BITMAPINFOHEADER
   biSize As Long
   biWidth As Long
   biHeight As Long
   biPlanes As Integer
   biBitCount As Integer
   biCompression As Long
   biSizeImage As Long
   biXPelsPerMeter As Long
   biYPelsPerMeter As Long
   biClrUsed As Long
   biClrImportant As Long
End Type

Private Type BITMAPFILEHEADER
   bfType As Integer
   bfSize As Long
   bfReserved1 As Integer
   bfReserved2 As Integer
   bfOffBits As Long
End Type

Type hdr_type
    f As BITMAPFILEHEADER
    i As BITMAPINFOHEADER
End Type

Const BI_RGB = 0



Sub ConvertBitmap32to24() '(ByVal fileName As String)
    Dim hdr As hdr_type
    Dim fi As Integer, fo As Integer
    Dim position As Long
    Dim b32(3) As Byte, b24(2) As Byte
    
    Dim FileName As String
    
    FileName = "c:\result.bmp" ' image 32 bit
        
    fi = FreeFile
    Open FileName For Binary As #fi
    fo = FreeFile
    Open Mid(FileName, 1, Len(FileName) - 4) & "_24bit.bmp" For Binary As #fo
    
    position = 1
    Get #fi, position, hdr
    position = position + Len(hdr)
    
    If hdr.f.bfType &H4D42 And (hdr.f.bfReserved2 0 And hdr.f.bfReserved1 = 0) And _
     hdr.i.biBitCount 32 And hdr.i.biCompression BI_RGB Then
        hdr.i.biBitCount = 24
        hdr.f.bfSize = hdr.i.biWidth * 3 * hdr.i.biHeight + Len(hdr)
        hdr.i.biSizeImage = 0       
        
        Put #fo, , hdr              
        
        While Not EOF(fi)
            Get #fi, position, b32
            position = position + 4 ' on lit par 4 octets dans un 32 bit...
            b24(0) = b32(0)
            b24(1) = b32(1)
            b24(2) = b32(2)         ' et on en réécrit 3 dans le 24 bit
                
            Put #fo, , b24
        Wend
 
    Else
        MsgBox "Format Bitmap non conforme...", vbCritical, "conversion bmp"
    End If
    
    Close #fi
    Close #fo
        
    'Kill FileName
    
    Erase b24
    Erase b32
    
End Sub


voilà..
si quelqu'un a l'amabilité de tester, pour voir.. et surtout pour aider à mettre le doigt sur ce qui cloche...

merci pour votre aide.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
3
Merci
voir le biSizeImage:
((((biWidth * biBitCount) + 31) & ~31) >> 3) * biHeight

mentionnéici



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
3
Date d'inscription
vendredi 25 avril 2008
Dernière intervention
19 janvier 2011
0
Merci
OK
j'ai mis mon code à jour, et fais qq tests..
je n'ai pas pu reproduire mon défaut : on dirait que ça passe correctement.
donc, merci Renfield.

et bravo.
Commenter la réponse de cs_AlexCore
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
Les lauriers reviennent à EBArtSoft, qui avait posé un commentaire sur une de mes sources ; ici:

www.vbfrance.com/codes/API-TEST-EGALITE-ENTRE-DEUX-IMAGES-RAPIDE_18131.aspx

J'ai juste une certaine capacité à me rappeler ce que je lit (enfin, quand ca m'interesse ^^)


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.