请问各位高手,如何将一张440*250,大小为500K的JPG图片压缩为20K,而其高和宽仍为440*250,望 赐教!

解决方案 »

  1.   

    'modPicCompress
    '使用范例:
    '加入一个Picture1,然后用下面的代码
    'isCompressPicOk Picture1, "C:\wtemp.bmp", "C:\wtemp.jpg"Option Explicit
    Private Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputbuf As GdiplusStartupInput, ByVal outputbuf As Long) As Long
    Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
    Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As Long, ByVal hpal As Long, Bitmap As Long) As Long
    Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Long) As Long
    Private Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal filename As Long, clsidEncoder As GUID, encoderParams As Any) As Long
    Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
    Private Declare Function GdipCreateBitmapFromFile Lib "GDIPlus" (ByVal filename As Long, Bitmap As Long) As LongPrivate Type GUID
        Data1 As Long
        Data2 As Integer
        Data3 As Integer
        Data4(0 To 7) As Byte
    End TypePrivate Type GdiplusStartupInput
        GdiplusVersion As Long
        DebugEventCallback As Long
        SuppressBackgroundThread As Long
        SuppressExternalCodecs As Long
    End TypePrivate Type EncoderParameter
        GUID As GUID
        NumberOfValues As Long
        type As Long
        Value As Long
    End TypePrivate Type EncoderParameters
        Count As Long
        Parameter As EncoderParameter
    End Type'pic1,图片框
    'strPicSourceFile 要处理的图片文件路径
    'strPicSaveFile 处理后保存的路径
    Public Function isCompressPicOk(pic1 As PictureBox, strPicSourceFile$, strPicSaveFile$) As Boolean
        pic1.Picture = LoadPicture(strPicSourceFile) '打开要压缩的图片
        isCompressPicOk = PictureBoxSaveJPG(pic1, strPicSaveFile) '保存压缩后的图片
    End Function
    Public Function PictureBoxSaveJPG(ByVal pict As StdPicture, ByVal filename As String, Optional ByVal quality As Byte = 80) As Boolean
        Dim tSI As GdiplusStartupInput
        Dim lRes As Long
        Dim lGDIP As Long
        Dim lBitmap As Long
        
        '初始化 GDI+
        tSI.GdiplusVersion = 1
        lRes = GdiplusStartup(lGDIP, tSI, 0)
        
        If lRes = 0 Then
            '从句柄创建 GDI+ 图像
            lRes = GdipCreateBitmapFromHBITMAP(pict.Handle, 0, lBitmap)
            
            If lRes = 0 Then
                Dim tJpgEncoder As GUID
                Dim tParams As EncoderParameters
                
                '初始化解码器的GUID标识
                CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
                
                '设置解码器参数
                tParams.Count = 1
                With tParams.Parameter ' Quality
                    '得到Quality参数的GUID标识
                    CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID
                    .NumberOfValues = 1
                    .type = 4
                    .Value = VarPtr(quality)
                End With
                
                '保存图像
                lRes = GdipSaveImageToFile(lBitmap, StrPtr(filename), tJpgEncoder, tParams)
                
                '销毁GDI+图像
                GdipDisposeImage lBitmap
            End If
            
            '销毁 GDI+
            GdiplusShutdown lGDIP
        End If
        
        If lRes Then
            PictureBoxSaveJPG = False
        Else
            PictureBoxSaveJPG = True
        End If
    End Function
      

  2.   

    440*250的JPG图像,有500K不怎么正常,建议你看看这个到底是不是JPG图像,不要只看后缀。
      

  3.   

    是不太正常,440*250的JPG图像应该只有20-30K左右.
      

  4.   

    可能LZ在举例时就随便用了 500K这个数量吧,呵呵