| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 21.02.2007, 10:09    Titel: [VB6] cDIB-Class & Rotation |   |  
				| 
 |  
				| Hallöle! 
 Ich habe ein Problem bei einer Rotationsfunktion in meiner cDIB Klasse. (Letzte Funktion)
 
  	  | Code: |  	  | Option Explicit
 Option Base 0
 
 Private Const BMP_MAGIC_COOKIE As Integer = 19778
 Private Const BI_RGB  As Long = 0&
 Private Const HEAP_ZERO_MEMORY As Long = &H8
 
 Private Type BITMAPFILEHEADER
 bfType As Integer
 bfSize As Long
 bfReserved1 As Integer
 bfReserved2 As Integer
 bfOffBits As Long
 End Type
 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 RGBQUAD
 Red As Byte
 Green As Byte
 Blue As Byte
 Reserved As Byte
 End Type
 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 Declare Function GetProcessHeap Lib "kernel32.dll" () As Long
 Private Declare Function HeapAlloc Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
 Private Declare Function HeapFree Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal lpMem As Long) As Long
 Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef dest As Any, ByRef src As Any, ByVal dwLen As Long)
 
 Private m_memBitsRot() As Byte
 Private m_memBits() As Byte
 Private m_memBitmapInfo() As Byte
 Private m_bih As BITMAPINFOHEADER
 Private m_bfh As BITMAPFILEHEADER
 
 Public Function CheckErr() As Long
 CheckErr = Err.Number
 Err.Clear
 End Function
 
 Public Function CreateFromFile(ByVal V_FilePathName As String) As Boolean
 On Error Resume Next
 CreateFromFile = False
 If ExistFile(V_FilePathName) = True Then
 Dim FID As Long
 Dim EID As Long
 FID = FreeFile
 Open V_FilePathName For Binary Access Read As FID
 EID = CheckErr
 Select Case EID
 Case 0
 Get FID, , m_bfh
 If m_bfh.bfType = BMP_MAGIC_COOKIE Then
 Get FID, Len(m_bfh) + 1, m_bih
 ReDim m_memBits(0 To m_bih.biSizeImage - 1)
 Get FID, m_bfh.bfOffBits + 1, m_memBits
 ReDim m_memBitmapInfo(0 To m_bfh.bfOffBits - 14)
 Get FID, Len(m_bfh) + 1, m_memBitmapInfo
 CreateFromFile = True
 Else: Debug.Print "File is not a supported bitmap format"
 End If
 Close FID
 Case 70: Debug.Print "File is locked - cannot access"
 Case Else: Debug.Print "Unknow Error"
 End Select
 Else: Debug.Print "File does not exist"
 End If
 End Function
 
 Public Function CreateFromPackedDIBPointer(ByRef V_DIBPointer As Long) As Boolean
 On Error Resume Next
 CreateFromPackedDIBPointer = False
 If V_DIBPointer <> 0 Then
 Call CopyMemory(ByVal VarPtr(m_bih.biSize), ByVal V_DIBPointer, Len(m_bih))
 If m_bih.biBitCount >= 16 Then
 If m_bih.biSizeImage > 0 Then
 ReDim m_memBits(0 To m_bih.biSizeImage - 1)
 Call CopyMemory(m_memBits(0), ByVal V_DIBPointer + 40, m_bih.biSizeImage)
 ReDim m_memBitmapInfo(0 To 39)
 Call CopyMemory(m_memBitmapInfo(0), m_bih, Len(m_bih))
 With m_bfh
 .bfType = BMP_MAGIC_COOKIE
 .bfSize = 55 + m_bih.biSizeImage
 .bfReserved1 = 0&
 .bfReserved2 = 0&
 .bfOffBits = 54
 End With
 CreateFromPackedDIBPointer = True
 End If
 Else: Debug.Print "Error! DIB was less than 16 colors."
 End If
 End If
 End Function
 
 Public Function WriteToFile(ByVal V_FilePathName As String, Optional RotatetBits As Boolean = False) As Boolean
 On Error Resume Next
 WriteToFile = False
 If ExistFile(V_FilePathName) = False Then
 Dim FID As Integer
 FID = FreeFile()
 Open V_FilePathName For Binary As FID
 Put FID, 1, m_bfh
 Put FID, Len(m_bfh) + 1, m_memBitmapInfo
 If RotatetBits = False Then
 Put FID, , m_memBits
 Else: Put FID, , m_memBitsRot
 End If
 Close FID
 WriteToFile = True
 End If
 End Function
 
 Private Function ExistFile(ByVal V_FilePathName As String) As Boolean
 On Error Resume Next
 ExistFile = False
 If Dir(V_FilePathName) <> "" Then
 If (GetAttr(V_FilePathName) And vbDirectory) <> vbDirectory Then ExistFile = True
 End If
 End Function
 
 Public Property Get BitCount() As Long
 BitCount = m_bih.biBitCount
 End Property
 
 Public Property Get Height() As Long
 Height = m_bih.biHeight
 End Property
 
 Public Property Get Width() As Long
 Width = m_bih.biWidth
 End Property
 
 Public Property Get Compression() As Long
 Compression = m_bih.biCompression
 End Property
 
 Public Property Get SizeInfoHeader() As Long
 SizeInfoHeader = m_bih.biSize
 End Property
 
 Public Property Get SizeImage() As Long
 SizeImage = m_bih.biSizeImage
 End Property
 
 Public Property Get Planes() As Long
 Planes = m_bih.biPlanes
 End Property
 
 Public Property Get ClrImportant() As Long
 ClrImportant = m_bih.biClrImportant
 End Property
 
 Public Property Get ClrUsed() As Long
 ClrUsed = m_bih.biClrUsed
 End Property
 
 Public Property Get XPPM() As Long
 XPPM = m_bih.biXPelsPerMeter
 End Property
 
 Public Property Get YPPM() As Long
 YPPM = m_bih.biYPelsPerMeter
 End Property
 
 Public Property Get FileType() As Long
 FileType = m_bfh.bfType
 End Property
 
 Public Property Get SizeFileHeader() As Long
 SizeFileHeader = m_bfh.bfSize
 End Property
 
 Public Property Get BitOffset() As Long
 BitOffset = m_bfh.bfOffBits
 End Property
 
 Public Property Get PointerToBits() As Long
 PointerToBits = VarPtr(m_memBits(0))
 End Property
 
 Public Property Get PointerToBitsRotate() As Long
 PointerToBitsRotate = VarPtr(m_memBitsRot(0))
 End Property
 
 Public Property Get PointerToBitmapInfo() As Long
 PointerToBitmapInfo = VarPtr(m_memBitmapInfo(0))
 End Property
 
 Public Property Get SizeBitmapInfo() As Long
 SizeBitmapInfo = UBound(m_memBitmapInfo()) + 1
 End Property
 
 Public Function Rotate_Pic(V_Angel As Double)
 On Error Resume Next
 '===
 '=== Zentral Drehen
 '===
 
 DoEvents
 Dim RotX As Long
 Dim RotY As Long
 Dim ASin As Double
 Dim ACos As Double
 Dim X As Long
 Dim Y As Long
 Dim XS As Long
 Dim YS As Long
 Dim XX As Long
 Dim YX As Long
 Dim srcR As Byte
 Dim srcG As Byte
 Dim srcB As Byte
 Dim Tot As Double
 ReDim m_memBitsRot(UBound(m_memBits)) As Byte
 RotX = m_bih.biWidth / 2
 RotY = m_bih.biHeight / 2
 ASin = Sin(V_Angel)
 ACos = Cos(V_Angel)
 XX = 0
 YX = 0
 For Y = 0 To m_bih.biHeight - 1
 For X = 0 To m_bih.biWidth
 '        XS = RotX + (XX - RotX) * ASin - (YX - RotY) * ACos
 '        YS = RotY + (YX - RotY) * ASin + (XX - RotX) * ACos
 XS = RotX + XX * ASin - YX * ACos
 YS = RotY + YX * ASin + XX * ACos
 If (XS >= 0 And XS < m_bih.biWidth) Then
 If (YS >= 0 And YS < m_bih.biHeight) Then
 
 srcR = m_memBits((((Y * m_bih.biWidth) + X) * 3 + 0))
 srcG = m_memBits((((Y * m_bih.biWidth) + X * 3) + 1))
 srcB = m_memBits((((Y * m_bih.biWidth) + X * 3) + 2))
 m_memBitsRot((((YS * m_bih.biWidth) + XS) * 3 + 0)) = srcR
 m_memBitsRot((((YS * m_bih.biWidth) + XS) * 3 + 0)) = srcG
 m_memBitsRot((((YS * m_bih.biWidth) + XS) * 3 + 0)) = srcB
 
 End If
 End If
 XX = XX + 1
 If Tot < Timer Then: DoEvents: Tot = Timer
 Next
 XX = 0
 YX = YX + 1
 If Tot < Timer Then: DoEvents: Tot = Timer
 Next
 End Function
 
 | 
 
 Ich Lade eine BMP in die Klasse, mit CreateFromFile, und möchte dann das Bild im Speicher m_memBits() Rotiert in m_memBitsRot() kopieren.
 
 Leider erhalte ich nach dem Speichern der BMP und dem Laden in die PictureBox nur nen grünen Strich, der sich n bissi chaotisch durch die gegend dreht.
 
 Hab auch schon so ziemlich alle kombinationen ausprobiert, die man da irgend wie mit XX / XY / RotX / ROTY / Sin / Cos / ...) zusammen setzen kann, aber irgend wie kommt da entweder garnix bei raus, nur n weißer strich ganz unten links, oder n grüner, der sich dreht. Hatte auch schon 3 symetrische nebeneinander, die syncron Bockmisst machen.
 
 Sieht da event Irgend jemand den Feher? .. (Wäre ziemlich wichtig, muss da noch n haufen code drum rum haun
  ) 
 PS: Sind 24Bit-Bitmaps
 
 
 MfG
 TPM
 _________________
 [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
 |  |