VB - Conversion Bitmap 32 en 24 bit.

Résolu
cs_AlexCore Messages postés 3 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 19 janvier 2011 - 7 oct. 2010 à 15:34
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 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.

3 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 oct. 2010 à 14:23
voir le biSizeImage:
((((biWidth * biBitCount) + 31) & ~31) >> 3) * biHeight

mentionnéici



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
3
cs_AlexCore Messages postés 3 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 19 janvier 2011
8 oct. 2010 à 15:22
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.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 oct. 2010 à 15:52
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
0
Rejoignez-nous