Richard87 Skrevet 16. juni 2005 Del Skrevet 16. juni 2005 kossen kan eg lasta opp ei bmp fil eg har liggande pa PC'en opp i en "Binary Arra"(Med 2 dimmensjoner?) UTEN bruk av ein controll eller vindu('Window less')... nagen ide? Lenke til kommentar
aadnk Skrevet 16. juni 2005 Del Skrevet 16. juni 2005 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
GeirGrusom Skrevet 17. juni 2005 Del Skrevet 17. juni 2005 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
CronoMan Skrevet 14. juli 2005 Del Skrevet 14. juli 2005 ... 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å) bitshift << : int / 32767 bitshift >> : int * 32767 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå