请写出API函数的名字和参数注释,
最好列出例子和源代码

解决方案 »

  1.   

    Option Explicit
    '============VB中实现BMP > GIF>JPG========================
    Private Type RGBTRIPLE
         rgbRed As Byte
         rgbGreen As Byte
         rgbBlue As Byte
    End TypePrivate Type RGBQUAD
         rgbBlue As Byte
         rgbGreen As Byte
         rgbRed As Byte
         rgbReserved As Byte
    End TypePrivate Type BITMAPINFOHEADER '40 bytes
         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 TypePrivate Type BITMAPINFO256
         bmiHeader As BITMAPINFOHEADER
         bmiColors(0 To 255) As RGBQUAD
    End TypePrivate Type BITMAP '14 bytes
       bmType As Long
       bmWidth As Long
       bmHeight As Long
       bmWidthBytes As Long
       bmPlanes As Integer
       bmBitsPixel As Integer
       bmBits As Long
    End TypePrivate Const BI_RGB = 0&Private Declare Function CreateDCAsNull Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, lpDeviceName As Any, lpOutput As Any, lpInitData As Any) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDc 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 SelectObject Lib "gdi32" (ByVal hDc As Long, ByVal hObject As Long) As Long
    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
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hDc As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO256, ByVal wUsage As Long) As Long
    Private Declare Function CreateDIBSection256 Lib "gdi32" Alias "CreateDIBSection" (ByVal hDc As Long, pBitmapInfo As BITMAPINFO256, ByVal un As Long, lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
    Private Const DIB_RGB_COLORS = 0Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
    '============================GIF STAFF================Private Type GifScreenDes criptor
         logical_screen_width As Integer
         logical_screen_height As Integer
         flags As Byte
         background_color_index As Byte
         pixel_aspect_ratio As Byte
    End TypePrivate Type GifImageDes criptor
         Left As Integer
         Top As Integer
         Width As Integer
         Height As Integer
         Format As Byte 'ImageFormat
    End TypeConst GIF87a = "GIF87a"
    Const GifTerminator As Byte = &H3B
    Const ImageSeparator As Byte = &H2C
    Const CHAR_BIT = 8
    Const CodeSize As Byte = 9
    Const ClearCode = 256
    Const EndCode  As Integer = 257
    Const FirstCode = 258
    Const LastCode As Integer = 511
    Const MAX_CODE = LastCode - FirstCodePrivate colTable As New Collection
    Private fn As Integer
    Private gifPalette(0 To 255) As RGBTRIPLE
    Private bit_position As Integer
    Private code_count As Integer
    Private data_buffer(255) As Byte
    Private aPower2(31) As Long
    Private picWidth As Long, picHeight As Long
    Private IsBusy As Boolean
    Public Event Progress(ByVal Percents As Integer)Public Function SaveGIF(ByVal pic As StdPicture, ByVal sFileName As String, Optional hDc As Long = 0) As Boolean
       If IsBusy Then Exit Function
       Dim scr As GifScreenDes criptor, im As GifImageDes criptor
       Dim bi As BITMAPINFO256, bm As BITMAP
       Dim hDCScn As Long, OldObj As Long, Src_hDc As Long
       Dim hDib256 As Long, hDC256 As Long, OldObj256 As Long
       Dim buf() As Byte, data As Byte
       Dim I As Long, J As Long
       Dim intCode As Integer, nCount  As Integer
       Dim sPrefix As String, sByte As String
       Dim tempPic As StdPicture
       IsBusy = True
    'get image size and allocate buffer memory
       Call GetObjectAPI(pic, Len(bm), bm)
       picWidth = bm.bmWidth
       picHeight = bm.bmHeight
       ReDim buf(CLng(((picWidth + 3) \ 4) * 4), picHeight) As Byte
    'Prepare DC for paintings
       hDCScn = CreateDCAsNull("DISPLAY", ByVal 0&, ByVal 0&, ByVal 0&)
       hDC256 = CreateCompatibleDC(hDCScn)
       If hDc = 0 Then
          Src_hDc = CreateCompatibleDC(hDCScn)
          OldObj = SelectObject(Src_hDc, pic)
       Else
          Src_hDc = hDc
       End If
       DeleteDC hDCScn
      

  2.   

    If bm.bmBitsPixel <> 8 Then hDib256 = CreateDib256(hDC256, bi)
       If hDib256 <> 0 Then
          OldObj256 = SelectObject(hDC256, hDib256)
          Call BitBlt(hDC256, 0, 0, picWidth, picHeight, Src_hDc, 0, 0, vbSrcCopy)
          For I = 0 To picHeight - 1
              Call GetDIBits(hDC256, hDib256, I, 1, buf(0, picHeight - I), bi, 0)
          Next
       Else
          With bi.bmiHeader
              .biSize = Len(bi.bmiHeader)
              .biWidth = picWidth
              .biHeight = picHeight
              .biPlanes = 1
              .biBitCount = 8
              .biCompression = BI_RGB
          End With
          For I = 0 To picHeight - 1
              Call GetDIBits(Src_hDc, pic, I, 1, buf(0, picHeight - I), bi, 0)
          Next
       End If
       For I = 0 To 255
           gifPalette(I).rgbBlue = bi.bmiColors(I).rgbBlue
           gifPalette(I).rgbGreen = bi.bmiColors(I).rgbGreen
           gifPalette(I).rgbRed = bi.bmiColors(I).rgbRed
       Next
       fn = FreeFile
       scr.background_color_index = 0
       scr.flags = &HF7 '256-color gif with global color map
       scr.pixel_aspect_ratio = 0
       
       im.Format = &H7 'GlobalNonInterlaced
       im.Height = picHeight
       im.Width = picWidth
      
       If FileExists(sFileName) Then Kill sFileName
      
       Open sFileName For Binary As fn
    'Write GIF header and header info
         Put #fn, , GIF87a
         Put #fn, , scr
         Put #fn, , gifPalette
         Put #fn, , ImageSeparator
         Put #fn, , im
         data = CodeSize - 1
         Put #fn, , data
         data_buffer(0) = 0
         bit_position = CHAR_BIT
    'Process pixels data using LZW - GIF compression
         For I = 1 To picHeight
             Reinitialize
             sPrefix = ""
             intCode = buf(0, I)
             On Error Resume Next
             For J = 1 To picWidth - 1
                 sByte = MyFormat(buf(J, I))
                 sPrefix = sPrefix & sByte
                 intCode = colTable(sPrefix)
                 If Err <> 0 Then 'Prefix wasn't in collection - save it and output code
                    nCount = colTable.count
                    If nCount = MAX_CODE Then Reinitialize
                     colTable.Add nCount + FirstCode, sPrefix
                     OutputBits intCode, CodeSize
                     sPrefix = sByte
                     intCode = buf(J, I)
                     Err.Clear
                 End If
             Next
             OutputBits intCode, CodeSize
             If I Mod 10 = 0 Then
                RaiseEvent Progress(I * 100 / picHeight)
                DoEvents
             End If
         Next
         OutputCode (EndCode)
         For I = 0 To data_buffer(0)
             Put #fn, , data_buffer(I)
         Next
         data = 0
         Put #fn, , data
         Put #fn, , GifTerminator
       Close fn
       Erase buf
       If hDc = 0 Then
          SelectObject Src_hDc, OldObj
          DeleteDC Src_hDc
       End If
       SelectObject hDC256, OldObj256
       DeleteObject hDib256
       DeleteDC hDC256
       SaveGIF = True
       IsBusy = False
    End Function
      Private Sub OutputBits(Value As Integer, count As Integer)
       Dim I As Integer, bit As Integer
       Do While I < count
          If bit_position >= CHAR_BIT Then
             If data_buffer(0) = 255 Then
                Put #fn, , data_buffer
                data_buffer(0) = 1
             Else
                data_buffer(0) = data_buffer(0) + 1
             End If
             data_buffer(data_buffer(0)) = 0
             bit_position = 0
           End If
           bit = Sgn(Power2(I) And Value)
           If bit > 0 Then data_buffer(data_buffer(0)) = Power2(bit_position) Or data_buffer(data_buffer(0))
           bit_position = bit_position + 1
           I = I + 1
       Loop
    End SubPrivate Sub OutputCode(code As Integer)
       code_count = code_count + 1
       If code_count > LastCode Then
          code_count = FirstCode
          Call OutputBits(ClearCode, CodeSize)
          ClearTable
        End If
        Call OutputBits(code, CodeSize)
    End SubPrivate Sub ClearTable()
       Set colTable = Nothing
       Set colTable = New Collection
    End SubPrivate Sub Reinitialize()
       ClearTable
       Call OutputBits(ClearCode, CodeSize)
    End SubPrivate Function FileExists(ByVal strPathName As String) As Boolean
       Dim af As Long
       af = GetFileAttributes(strPathName)
       FileExists = (af <> -1)
    End Function
      

  3.   

    Private Function Power2(ByVal I As Integer) As Long
        If aPower2(0) = 0 Then
           aPower2(0) = &H1&
           aPower2(1) = &H2&
           aPower2(2) = &H4&
           aPower2(3) = &H8&
           aPower2(4) = &H10&
           aPower2(5) = &H20&
           aPower2(6) = &H40&
           aPower2(7) = &H80&
           aPower2(8) = &H100&
           aPower2(9) = &H200&
           aPower2(10) = &H400&
           aPower2(11) = &H800&
           aPower2(12) = &H1000&
           aPower2(13) = &H2000&
           aPower2(14) = &H4000&
           aPower2(15) = &H8000&
           aPower2(16) = &H10000
           aPower2(17) = &H20000
           aPower2(18) = &H40000
           aPower2(19) = &H80000
           aPower2(20) = &H100000
           aPower2(21) = &H200000
           aPower2(22) = &H400000
           aPower2(23) = &H800000
           aPower2(24) = &H1000000
           aPower2(25) = &H2000000
           aPower2(26) = &H4000000
           aPower2(27) = &H8000000
           aPower2(28) = &H10000000
           aPower2(29) = &H20000000
           aPower2(30) = &H40000000
           aPower2(31) = &H80000000
        End If
        Power2 = aPower2(I)
    End FunctionPrivate Function MyFormat(ByVal s As String) As String
       MyFormat = Right$("00" & s, 3)
    End FunctionPrivate Function CreateDib256(ByVal h_Dc As Long, bi As BITMAPINFO256) As Long
       Dim lScanSize As Long
       Dim lptr As Long, lIndex As Long
       Dim r As Long, g As Long, b As Long
       Dim rA As Long, gA As Long, bA As Long
       With bi.bmiHeader
           .biSize = Len(bi.bmiHeader)
           .biWidth = picWidth
           .biHeight = picHeight
           .biPlanes = 1
           .biBitCount = 8
           .biCompression = BI_RGB
           lScanSize = (picWidth + picWidth Mod 4)
           .biSizeImage = lScanSize * picHeight
       End With
       ' Halftone 256 colour palette
       For b = 0 To &H100 Step &H40
          If b = &H100 Then
             bA = b - 1
          Else
             bA = b
          End If
          For g = 0 To &H100 Step &H40
             If g = &H100 Then
                gA = g - 1
             Else
                gA = g
             End If
             For r = 0 To &H100 Step &H40
                If r = &H100 Then
                   rA = r - 1
                Else
                   rA = r
                End If
                With bi.bmiColors(lIndex)
                   .rgbRed = rA: .rgbGreen = gA: .rgbBlue = bA
                End With
                lIndex = lIndex + 1
             Next r
          Next g
       Next b
       CreateDib256 = CreateDIBSection256(h_Dc, bi, DIB_RGB_COLORS, lptr, 0, 0)
    End Function
      

  4.   

    upup!夜已深,还有什么人,像我这样,醒着在编程
    -------------------------------
    海纳百川,有容乃大;
    壁立千仞,无欲则刚。
      

  5.   

    楼上的是保存GIF的,保存JPEG的见:
    http://3rdapple.51.net/BMP2JPEG.zip
    顺便说一下,那个保存GIF的代码效果不是很好,建议楼主还是用Delphi写DLL在VB里面调用实在。
      

  6.   

    我以前是看不懂Jpeg压缩标准
    现在好不容易看懂了(不仅是老Jpeg的离散余弦变换,连Jpeg2000的小波变换也看懂了)
    可偏偏没有时间写转换程序了
    还是你们自己努力吧
    JPEG 简易文档 V2.12
    http://member.netease.com/~cloudwu/2000/download/jpeg.txt