home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / Video_Surv21911810202010.psc / cDIBSection.cls < prev    next >
Text File  |  2009-12-02  |  17KB  |  519 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cDIBSection"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16.  
  17. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
  18.     lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
  19.  
  20. Private Type SAFEARRAYBOUND
  21.     cElements As Long
  22.     lLbound As Long
  23. End Type
  24. Private Type SAFEARRAY2D
  25.     cDims As Integer
  26.     fFeatures As Integer
  27.     cbElements As Long
  28.     cLocks As Long
  29.     pvData As Long
  30.     Bounds(0 To 1) As SAFEARRAYBOUND
  31. End Type
  32. Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long
  33.  
  34. Private Type RGBQUAD
  35.     rgbBlue As Byte
  36.     rgbGreen As Byte
  37.     rgbRed As Byte
  38.     rgbReserved As Byte
  39. End Type
  40. Private Type BITMAPINFOHEADER '40 bytes
  41.     biSize As Long
  42.     biWidth As Long
  43.     biHeight As Long
  44.     biPlanes As Integer
  45.     biBitCount As Integer
  46.     biCompression As Long
  47.     biSizeImage As Long
  48.     biXPelsPerMeter As Long
  49.     biYPelsPerMeter As Long
  50.     biClrUsed As Long
  51.     biClrImportant As Long
  52. End Type
  53. Private Type BITMAPINFO
  54.     bmiHeader As BITMAPINFOHEADER
  55.     bmiColors As RGBQUAD
  56. End Type
  57. Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal HDC As Long) As Long
  58. Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
  59. Private Declare Function GetDesktopWindow Lib "user32" () As Long
  60. ' Note - this is not the declare in the API viewer - modify lplpVoid to be
  61. ' Byref so we get the pointer back:
  62. Private Declare Function CreateDIBSection Lib "gdi32" _
  63.     (ByVal HDC As Long, _
  64.     pBitmapInfo As BITMAPINFO, _
  65.     ByVal un As Long, _
  66.     lplpVoid As Long, _
  67.     ByVal handle As Long, _
  68.     ByVal dw As Long) As Long
  69. Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  70. Private Declare Function SelectObject Lib "gdi32" (ByVal HDC As Long, ByVal hObject As Long) As Long
  71. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  72. Private Declare Function DeleteDC Lib "gdi32" (ByVal HDC As Long) As Long
  73. Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal HDC As Long) As Long
  74. Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
  75. Private Const BI_RGB = 0&
  76. Private Const BI_RLE4 = 2&
  77. Private Const BI_RLE8 = 1&
  78. Private Const DIB_RGB_COLORS = 0 '  color table in RGBs
  79.  
  80. Private Type BITMAP
  81.     bmType As Long
  82.     bmWidth As Long
  83.     bmHeight As Long
  84.     bmWidthBytes As Long
  85.     bmPlanes As Integer
  86.     bmBitsPixel As Integer
  87.     bmBits As Long
  88. End Type
  89. Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
  90. Private Declare Function timeGetTime Lib "winmm.dll" () As Long
  91. Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal HDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
  92.  
  93. ' Clipboard functions:
  94. Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
  95. Private Declare Function CloseClipboard Lib "user32" () As Long
  96. Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
  97. Private Declare Function EmptyClipboard Lib "user32" () As Long
  98. Private Const CF_BITMAP = 2
  99. Private Const CF_DIB = 8
  100.  
  101. ' Handle to the current DIBSection:
  102. Private m_hDIb As Long
  103. ' Handle to the old bitmap in the DC, for clear up:
  104. Private m_hBmpOld As Long
  105. ' Handle to the Device context holding the DIBSection:
  106. Private m_hDC As Long
  107. ' Address of memory pointing to the DIBSection's bits:
  108. Private m_lPtr As Long
  109. ' Type containing the Bitmap information:
  110. Private m_tBI As BITMAPINFO
  111.  
  112.  
  113. Public Function CopyToClipboard( _
  114.         Optional ByVal bAsDIB As Boolean = True _
  115.     ) As Boolean
  116. Dim lhDCDesktop As Long
  117. Dim lhDC As Long
  118. Dim lhBmpOld As Long
  119. Dim hObj As Long
  120. Dim lFmt As Long
  121. Dim B() As Byte
  122. Dim tBI As BITMAPINFO
  123. Dim lPtr As Long
  124. Dim hDibCopy As Long
  125.  
  126.     lhDCDesktop = GetDC(GetDesktopWindow())
  127.     If (lhDCDesktop <> 0) Then
  128.         lhDC = CreateCompatibleDC(lhDCDesktop)
  129.         If (lhDC <> 0) Then
  130.             If (bAsDIB) Then
  131.                MsgBox "I don't know how to put a DIB on the clipboard! Copy as bitmap instead!!!"
  132.                 ' Create a duplicate DIBSection and copy
  133.                 ' to the clipboard:
  134.                 'LSet tBI = m_tBI
  135.                 'hDibCopy = CreateDIBSection( _
  136.                 '        lhDC, _
  137.                 '        m_tBI, _
  138.                 '        DIB_RGB_COLORS, _
  139.                 '        lPtr, _
  140.                 '        0, 0)
  141.                 'If (hDibCopy <> 0) Then
  142.                 '    lhBmpOld = SelectObject(lhDC, hObj)
  143.                 '    BitBlt lhDC, 0, 0, Width, Height, m_hDC, 0, 0, vbSrcCopy
  144.                 '    SelectObject lhDC, lhBmpOld
  145.                 '    lFmt = CF_DIB
  146.                 '
  147.                 '     '....
  148.                                     
  149.                 'Else
  150.                 '    hObj = 0
  151.                 'End If
  152.             Else
  153.                 ' Create a compatible bitmap and copy to
  154.                 ' the clipboard:
  155.                 hObj = CreateCompatibleBitmap(lhDCDesktop, Width, Height)
  156.                 If (hObj <> 0) Then
  157.                     lhBmpOld = SelectObject(lhDC, hObj)
  158.                     PaintPicture lhDC
  159.                     SelectObject lhDC, lhBmpOld
  160.                     lFmt = CF_BITMAP
  161.                     ' Now set the clipboard to the bitmap:
  162.                     If (OpenClipboard(0) <> 0) Then
  163.                         EmptyClipboard
  164.                         If (SetClipboardData(lFmt, hObj) <> 0) Then
  165.                             CopyToClipboard = True
  166.                         End If
  167.                         CloseClipboard
  168.                     End If
  169.                 End If
  170.             End If
  171.             DeleteDC lhDC
  172.         End If
  173.         DeleteDC lhDCDesktop
  174.     End If
  175. End Function
  176.  
  177. Public Function CreateDIB( _
  178.         ByVal lhDC As Long, _
  179.         ByVal lWidth As Long, _
  180.         ByVal lHeight As Long, _
  181.         ByRef hDib As Long _
  182.     ) As Boolean
  183.     With m_tBI.bmiHeader
  184.         .biSize = Len(m_tBI.bmiHeader)
  185.         .biWidth = lWidth
  186.         .biHeight = lHeight
  187.         .biPlanes = 1
  188.         .biBitCount = 24
  189.         .biCompression = BI_RGB
  190.         .biSizeImage = BytesPerScanLine * .biHeight
  191.     End With
  192.     hDib = CreateDIBSection( _
  193.             lhDC, _
  194.             m_tBI, _
  195.             DIB_RGB_COLORS, _
  196.             m_lPtr, _
  197.             0, 0)
  198.     CreateDIB = (hDib <> 0)
  199. End Function
  200. Public Function CreateFromPicture( _
  201.         ByRef picThis As StdPicture _
  202.     )
  203. Dim lhDC As Long
  204. Dim lhDCDesktop As Long
  205. Dim lhBmpOld As Long
  206. Dim tBMP As BITMAP
  207. Dim lhWnd As Long
  208.     
  209.     GetObjectAPI picThis.handle, Len(tBMP), tBMP
  210.     If (Create(tBMP.bmWidth, tBMP.bmHeight)) Then
  211.         lhWnd = GetDesktopWindow()
  212.         lhDCDesktop = GetDC(lhWnd)
  213.         If (lhDCDesktop <> 0) Then
  214.             lhDC = CreateCompatibleDC(lhDCDesktop)
  215.             ReleaseDC lhWnd, lhDCDesktop
  216.             If (lhDC <> 0) Then
  217.                 lhBmpOld = SelectObject(lhDC, picThis.handle)
  218.                 LoadPictureBlt lhDC
  219.                 SelectObject lhDC, lhBmpOld
  220.                 DeleteDC lhDC
  221.             End If
  222.         End If
  223.     End If
  224. End Function
  225. Public Function Create( _
  226.         ByVal lWidth As Long, _
  227.         ByVal lHeight As Long _
  228.     ) As Boolean
  229.     ClearUp
  230.     m_hDC = CreateCompatibleDC(0)
  231.     If (m_hDC <> 0) Then
  232.         If (CreateDIB(m_hDC, lWidth, lHeight, m_hDIb)) Then
  233.             m_hBmpOld = SelectObject(m_hDC, m_hDIb)
  234.             Create = True
  235.         Else
  236.             DeleteDC m_hDC
  237.             m_hDC = 0
  238.         End If
  239.     End If
  240. End Function
  241. Public Property Get BytesPerScanLine() As Long
  242.     ' Scans must align on dword boundaries:
  243.     BytesPerScanLine = (m_tBI.bmiHeader.biWidth * 3 + 3) And &HFFFFFFFC
  244. End Property
  245.  
  246. Public Property Get Width() As Long
  247.     Width = m_tBI.bmiHeader.biWidth
  248. End Property
  249. Public Property Get Height() As Long
  250.     Height = m_tBI.bmiHeader.biHeight
  251. End Property
  252.  
  253. Public Sub LoadPictureBlt( _
  254.         ByVal lhDC As Long, _
  255.         Optional ByVal lSrcLeft As Long = 0, _
  256.         Optional ByVal lSrcTop As Long = 0, _
  257.         Optional ByVal lSrcWidth As Long = -1, _
  258.         Optional ByVal lSrcHeight As Long = -1, _
  259.         Optional ByVal eRop As RasterOpConstants = vbSrcCopy _
  260.     )
  261.     If lSrcWidth < 0 Then lSrcWidth = m_tBI.bmiHeader.biWidth
  262.     If lSrcHeight < 0 Then lSrcHeight = m_tBI.bmiHeader.biHeight
  263.     BitBlt m_hDC, 0, 0, lSrcWidth, lSrcHeight, lhDC, lSrcLeft, lSrcTop, eRop
  264. End Sub
  265.  
  266.  
  267. Public Sub PaintPicture( _
  268.         ByVal lhDC As Long, _
  269.         Optional ByVal lDestLeft As Long = 0, _
  270.         Optional ByVal lDestTop As Long = 0, _
  271.         Optional ByVal lDestWidth As Long = -1, _
  272.         Optional ByVal lDestHeight As Long = -1, _
  273.         Optional ByVal lSrcLeft As Long = 0, _
  274.         Optional ByVal lSrcTop As Long = 0, _
  275.         Optional ByVal eRop As RasterOpConstants = vbSrcCopy _
  276.     )
  277.     If (lDestWidth < 0) Then lDestWidth = m_tBI.bmiHeader.biWidth
  278.     If (lDestHeight < 0) Then lDestHeight = m_tBI.bmiHeader.biHeight
  279.     BitBlt lhDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_hDC, lSrcLeft, lSrcTop, eRop
  280. End Sub
  281.  
  282.  
  283. Public Property Get XPPM() As Long
  284.     XPPM = m_tBI.bmiHeader.biXPelsPerMeter
  285. End Property
  286.  
  287. Public Property Get YPPM() As Long
  288.     YPPM = m_tBI.bmiHeader.biYPelsPerMeter
  289. End Property
  290.  
  291. Public Property Get BitCount() As Long
  292.     BitCount = m_tBI.bmiHeader.biBitCount
  293. End Property
  294. Public Property Get ClrUsed() As Long
  295.     ClrUsed = m_tBI.bmiHeader.biClrUsed
  296. End Property
  297.  
  298. Public Property Get Compression() As Long
  299.     Compression = m_tBI.bmiHeader.biCompression
  300. End Property
  301.  
  302. Public Property Get Planes() As Long
  303.     Planes = m_tBI.bmiHeader.biPlanes
  304. End Property
  305. Public Property Get ClrImportant() As Long
  306.     ClrImportant = m_tBI.bmiHeader.biClrImportant
  307. End Property
  308. Public Property Get SizeInfoHeader() As Long
  309.     SizeInfoHeader = m_tBI.bmiHeader.biSize
  310. End Property
  311. Public Property Get SizeImage() As Long
  312.     SizeImage = m_tBI.bmiHeader.biSizeImage
  313. End Property
  314.  
  315.  
  316. Public Property Get HDC() As Long
  317.     HDC = m_hDC
  318. End Property
  319. Public Property Get hDib() As Long
  320.     hDib = m_hDIb
  321. End Property
  322. Public Property Get DIBSectionBitsPtr() As Long
  323.     DIBSectionBitsPtr = m_lPtr
  324. End Property
  325. Public Sub RandomiseBits( _
  326.         Optional ByVal bGray As Boolean = False _
  327.     )
  328. Dim bDib() As Byte
  329. Dim x As Long, y As Long
  330. Dim lC As Long
  331. Dim tSA As SAFEARRAY2D
  332. Dim xEnd As Long
  333.     
  334.     ' Get the bits in the from DIB section:
  335.     With tSA
  336.         .cbElements = 1
  337.         .cDims = 2
  338.         .Bounds(0).lLbound = 0
  339.         .Bounds(0).cElements = m_tBI.bmiHeader.biHeight
  340.         .Bounds(1).lLbound = 0
  341.         .Bounds(1).cElements = BytesPerScanLine()
  342.         .pvData = m_lPtr
  343.     End With
  344.     CopyMemory ByVal VarPtrArray(bDib()), VarPtr(tSA), 4
  345.  
  346.     ' random:
  347.     Randomize Timer
  348.     
  349.     xEnd = (Width - 1) * 3
  350.     If (bGray) Then
  351.         For y = 0 To m_tBI.bmiHeader.biHeight - 1
  352.             For x = 0 To xEnd Step 3
  353.                 lC = Rnd * 255
  354.                 bDib(x, y) = lC
  355.                 bDib(x + 1, y) = lC
  356.                 bDib(x + 2, y) = lC
  357.             Next x
  358.         Next y
  359.     Else
  360.         For x = 0 To xEnd Step 3
  361.             For y = 0 To m_tBI.bmiHeader.biHeight - 1
  362.                 bDib(x, y) = 0
  363.                 bDib(x + 1, y) = Rnd * 255
  364.                 bDib(x + 2, y) = Rnd * 255
  365.             Next y
  366.         Next x
  367.     End If
  368.     
  369.     ' Clear the temporary array descriptor
  370.     ' (This does not appear to be necessary, but
  371.     ' for safety do it anyway)
  372.     CopyMemory ByVal VarPtrArray(bDib), 0&, 4
  373.     
  374. End Sub
  375.  
  376. Public Sub ClearUp()
  377.     If (m_hDC <> 0) Then
  378.         If (m_hDIb <> 0) Then
  379.             SelectObject m_hDC, m_hBmpOld
  380.             DeleteObject m_hDIb
  381.         End If
  382.         DeleteDC m_hDC
  383.     End If
  384.     m_hDC = 0: m_hDIb = 0: m_hBmpOld = 0: m_lPtr = 0
  385. End Sub
  386.  
  387. Public Function Resample( _
  388.         ByVal lNewHeight As Long, _
  389.         ByVal lNewWidth As Long _
  390.     ) As cDIBSection
  391. Dim cDib As cDIBSection
  392.     Set cDib = New cDIBSection
  393.     If cDib.Create(lNewWidth, lNewHeight) Then
  394.         If (lNewWidth <> m_tBI.bmiHeader.biWidth) Or (lNewHeight <> m_tBI.bmiHeader.biHeight) Then
  395.             ' Change in size, do resample:
  396.             ResampleDib cDib
  397.         Else
  398.             ' No size change so just return a copy:
  399.             cDib.LoadPictureBlt m_hDC
  400.         End If
  401.         Set Resample = cDib
  402.     End If
  403. End Function
  404.  
  405. Private Function ResampleDib(ByRef cDibTo As cDIBSection) As Boolean
  406. Dim bDibFrom() As Byte
  407. Dim bDibTo() As Byte
  408.  
  409. Dim tSAFrom As SAFEARRAY2D
  410. Dim tSATo As SAFEARRAY2D
  411.  
  412.     ' Get the bits in the from DIB section:
  413.     With tSAFrom
  414.         .cbElements = 1
  415.         .cDims = 2
  416.         .Bounds(0).lLbound = 0
  417.         .Bounds(0).cElements = m_tBI.bmiHeader.biHeight
  418.         .Bounds(1).lLbound = 0
  419.         .Bounds(1).cElements = BytesPerScanLine()
  420.         .pvData = m_lPtr
  421.     End With
  422.     CopyMemory ByVal VarPtrArray(bDibFrom()), VarPtr(tSAFrom), 4
  423.  
  424.     ' Get the bits in the to DIB section:
  425.     With tSATo
  426.         .cbElements = 1
  427.         .cDims = 2
  428.         .Bounds(0).lLbound = 0
  429.         .Bounds(0).cElements = cDibTo.Height
  430.         .Bounds(1).lLbound = 0
  431.         .Bounds(1).cElements = cDibTo.BytesPerScanLine()
  432.         .pvData = cDibTo.DIBSectionBitsPtr
  433.     End With
  434.     CopyMemory ByVal VarPtrArray(bDibTo()), VarPtr(tSATo), 4
  435.  
  436. Dim xScale As Single
  437. Dim yScale As Single
  438.  
  439. Dim x As Long, y As Long, xEnd As Long, xOut As Long
  440.  
  441. Dim fX As Single, fY As Single
  442. Dim ifY As Long, ifX As Long
  443. Dim dX As Single, dy As Single
  444. Dim r As Long, r1 As Single, r2 As Single, r3 As Single, r4 As Single
  445. Dim g As Long, g1 As Single, g2 As Single, g3 As Single, g4 As Single
  446. Dim B As Long, b1 As Single, b2 As Single, b3 As Single, b4 As Single
  447. Dim ir1 As Long, ig1 As Long, ib1 As Long
  448. Dim ir2 As Long, ig2 As Long, ib2 As Long
  449.  
  450.     xScale = (Width - 1) / cDibTo.Width
  451.     yScale = (Height - 1) / cDibTo.Height
  452.     
  453.     xEnd = cDibTo.Width - 1
  454.         
  455.     For y = 0 To cDibTo.Height - 1
  456.         
  457.         fY = y * yScale
  458.         ifY = Int(fY)
  459.         dy = fY - ifY
  460.         
  461.         For x = 0 To xEnd
  462.             fX = x * xScale
  463.             ifX = Int(fX)
  464.             dX = fX - ifX
  465.             
  466.             ifX = ifX * 3
  467.             ' Interpolate using the four nearest pixels in the source
  468.             b1 = bDibFrom(ifX, ifY): g1 = bDibFrom(ifX + 1, ifY): r1 = bDibFrom(ifX + 2, ifY)
  469.             b2 = bDibFrom(ifX + 3, ifY): g2 = bDibFrom(ifX + 4, ifY): r2 = bDibFrom(ifX + 5, ifY)
  470.             b3 = bDibFrom(ifX, ifY + 1): g3 = bDibFrom(ifX + 1, ifY + 1): r3 = bDibFrom(ifX + 2, ifY + 1)
  471.             b4 = bDibFrom(ifX + 3, ifY + 1): g4 = bDibFrom(ifX + 4, ifY + 1): r4 = bDibFrom(ifX + 5, ifY + 1)
  472.             
  473.             ' Interplate in x direction:
  474.             ir1 = r1 * (1 - dy) + r3 * dy: ig1 = g1 * (1 - dy) + g3 * dy: ib1 = b1 * (1 - dy) + b3 * dy
  475.             ir2 = r2 * (1 - dy) + r4 * dy: ig2 = g2 * (1 - dy) + g4 * dy: ib2 = b2 * (1 - dy) + b4 * dy
  476.             ' Interpolate in y:
  477.             r = ir1 * (1 - dX) + ir2 * dX: g = ig1 * (1 - dX) + ig2 * dX: B = ib1 * (1 - dX) + ib2 * dX
  478.             
  479.             ' Set output:
  480.             If (r < 0) Then r = 0
  481.             If (r > 255) Then r = 255
  482.             If (g < 0) Then g = 0
  483.             If (g > 255) Then g = 255
  484.             If (B < 0) Then B = 0
  485.             If (B > 255) Then
  486.                 B = 255
  487.             End If
  488.             xOut = x * 3
  489.             bDibTo(xOut, y) = B
  490.             bDibTo(xOut + 1, y) = g
  491.             bDibTo(xOut + 2, y) = r
  492.             
  493.         Next x
  494.         
  495.     Next y
  496.  
  497.     ' Clear the temporary array descriptor
  498.     ' (This does not appear to be necessary, but
  499.     ' for safety do it anyway)
  500.     CopyMemory ByVal VarPtrArray(bDibFrom), 0&, 4
  501.     CopyMemory ByVal VarPtrArray(bDibTo), 0&, 4
  502.  
  503.  
  504. End Function
  505.  
  506. Private Sub Class_Terminate()
  507.     ClearUp
  508. End Sub
  509. Public Property Get PointerToBitmapInfo() As Long
  510.     PointerToBitmapInfo = VarPtr(m_tBI.bmiHeader.biSize)
  511. End Property
  512.  
  513. Public Property Get SizeBitmapInfo() As Long
  514.     SizeBitmapInfo = 40
  515. End Property
  516.  
  517.  
  518.  
  519.