Gå til innhold

lasta ett bmp fil til binary array?


Anbefalte innlegg

Videoannonse
Annonse

Jeg tror muligens du kan benytte LoadImage samt VarPtrArray til dette formålet:

 

Option Explicit

 

Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal dwImageType As Long, ByVal dwDesiredWidth As Long, ByVal dwDesiredHeight As Long, ByVal dwFlags As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long

Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)

 

Private Type BITMAP

    bmType As Long

    bmWidth As Long

    bmHeight As Long

    bmWidthBytes As Long

    bmPlanes As Integer

    bmBitsPixel As Integer

    bmBits As Long

End Type

 

Private Type SAFEARRAYBOUND

    cElements As Long

    lLbound As Long

End Type

 

Private Type SAFEARRAY2D

    cDims As Integer

    fFeatures As Integer

    cbElements As Long

    cLocks As Long

    pvData As Long

    Bounds(0 To 1) As SAFEARRAYBOUND

End Type

 

Const IMAGE_BITMAP = 0

Const LR_LOADFROMFILE = &H10

Const LR_CREATEDIBSECTION = &H2000

 

Public Sub CleanArray(lpDestArray() As Byte)

 

    ' Fjern endelig referansepeker

    ZeroMemory ByVal VarPtrArray(lpDestArray), 4

 

End Sub

 

Private Function LoadBitmap(sPath As String, lpDestArray() As Byte, sa As SAFEARRAY2D, bitsPerPixel As Long) As Long

 

    Dim hBitmap As Long, bmp As BITMAP

   

    ' Last inn bildet

    hBitmap = LoadImage(App.hInstance, sPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE Or LR_CREATEDIBSECTION)

   

    ' Hent informasjon om punktgrafikken

    GetObjectAPI hBitmap, Len(bmp), bmp

   

    ' Initialiser array-informasjon

    With sa

        .cbElements = 1

        .cDims = 2

        .Bounds(1).lLbound = 0

        .Bounds(0).cElements = bmp.bmHeight

        .Bounds(1).lLbound = 0

        .Bounds(1).cElements = bmp.bmWidthBytes

        .pvData = bmp.bmBits

    End With

   

    ' Returner antall biter per piksel

    bitsPerPixel = bmp.bmBitsPixel

   

    ' Referer array til dette

    CopyMemory ByVal VarPtrArray(lpDestArray), VarPtr(sa), 4

 

    ' Returner peker til bildet

    LoadBitmap = hBitmap

 

End Function

 

Private Sub Form_Load()

 

    Dim hBitmap As Long, aArray() As Byte, sa As SAFEARRAY2D, bitsPerPixel As Long

   

    ' Last inn bildet

    hBitmap = LoadBitmap("C:\Test.bmp", aArray, sa, bitsPerPixel)

   

    ' Utfør hva enn som skal gjøres med arrayen

    ' ...

   

    ' Rydd opp etter oss (dette MÅ gjøres)

    CleanArray aArray

    DeleteObject hBitmap

 

End Sub

Lenke til kommentar

aadnk sin er sikkert best, men jeg legger ved BMP formatet hvis noen er interresert.

 

Bitmap fil formatet er veldig enkelt, bortsett fra at det lagres fra nederst i venstre til øverst i høyere.

 

Først kommer BITMAPFILEHEADER

Public Type BITMAPFILEHEADER

    bfType As Integer

    bfSize As Long

    bfReserved1 As Integer

    bfReserved2 As Integer

    bfOffBits As Long

End Type

 

Deretter kommer BITMAPINFOHEADER

 

Public Type BITMAPINFOHEADER

    biSize As Long

    biWidth As Long ' Bredde på bildet

    biHeight As Long ' Høyde på bildet

    biPlanes As Integer ' Må være 1

    biBitCount As Integer ' 1, 2, 4, 8, 16 eller 24 er godtatt

    biCompression As Long

    biSizeImage As Long

    biXPelsPerMeter As Long

    biYPelsPerMeter As Long

    biClrUsed As Long

    biClrImportant As Long

End Type

 

 

Hvis bildet er 24 bit, følger det BGR(Blue Green Red) struktur for resten av filen (biWidth * biHeight) men vanligvis gjør man en Seek([#file], BITMAPFILEHEADER.bfOffBits) og leser derfra.

Kommer det derimot 8 bit, følger først en palett, denne er laget av 256 BGRX struktur (Blue Green Red Unused), og deretter en array av biWidth * biHeight av byte, som peker til fargen i paletten.

 

16 bit er temmelig vanskelig å lese i BASIC, siden formatet er B5G6R5

4 Bit leses ved å utføre en And operasjon på hvert byte med &HF0, og Bit shift til venstre med 4, dette må gjøres i basic ved å dele (kanskje du trenger modulus også, gidder ikke å tenke på det nå)

Lenke til kommentar
  • 4 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...