回 帖 发 新 帖 刷新版面

主题:请教高手代码转换!!!

我在网上找到一段能对图片文件进行压缩的代码,可惜是VB,在下不懂,所以发贴请教高手帮助翻译成VFP代码一下,谢谢各位老师了!
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Type GdiplusStartupInput
    GdiplusVersion As Long
    DebugEventCallback As Long
    SuppressBackgroundThread As Long
    SuppressExternalCodecs As Long
End Type

Private Type EncoderParameter
    GUID As GUID
    NumberOfValues As Long
    type As Long
    Value As Long
End Type

Private Type EncoderParameters
    Count As Long
    Parameter As EncoderParameter
End Type

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 Long

Private Sub Command1_Click()
    Dim ret As Boolean
     
    Picture1.Picture = LoadPicture("C:\a.bmp") '打开要压缩的图片
     
    ret = PictureBoxSaveJPG(Picture1, "C:\b.jpg") '保存压缩后的图片
    If ret = False Then
        MsgBox "保存失败"
    End If
End Sub

Private 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

回复列表 (共11个回复)

沙发

用RAR命令,把图片文件放在RAR文件里不行???
rar安装目录下有帮助呢

板凳

谢谢homayzh的回复!
   可能你没理解到我的意思,这里的压缩不是指对文件的压缩,而是只把图像压缩后一样可以使用的方式,如把1.JPG(5MB大小),通过以上代码压缩后变成1.JPG(200KB大小),网上有此类程序工具,但没代码,我好不容易找来一个,却是VB代码,本人不懂VB,所以传上来让各位老师帮助翻译成VFP一下.
   比如:我上传的这个附件的功能!

3 楼

你这是将指定的图片文件,转换为 jpg 文件吧!!!

4 楼

[quote]你这是将指定的图片文件,转换为 jpg 文件吧!!![/quote]
cbl518老师你好,不是转换成JPG文件,而是把JPG文件图像压缩后生成新的JPG文件(图像大小不会变的,只是文件大小变了).

5 楼

JPG文件本身就已经是高压缩比的文件,在不改变图像分辨率的情况下,想再大幅度压缩jpg文件是不可能的。

6 楼

[quote]JPG文件本身就已经是高压缩比的文件,在不改变图像分辨率的情况下,想再大幅度压缩jpg文件是不可能的。[/quote]
你用过我上传的附件程序没?

7 楼

JPG图片压缩器.exe
确实将 jpg 压缩了,并保留了原尺寸不变。
是否可将vb源程序发给我!

8 楼

在VFP基类中找到一个JPG压缩类gpimage,gpimage的SAVETOFILE()方法可以将图片进行压缩处理,压缩比率也可以控件,我试了一下4.5M图片的压缩比率设置成20将生成300KB左右图片,浏览后发现效果很好!图片尺寸不变,清淅度也还可以,有兴趣的朋友可以试着用一下.在下把此类弄成一个函数的方式调用的:

**********************************************************************************
************************JPG文件压缩,但图片版面大小不变****************************
*****调用格式:CompressJPG(c要压缩的JPG文件,c压缩后的JPG文件,压缩比率10~100)*******
**********************************************************************************
FUNCTION CompressJPG
PARAMETERS cOpenFile as String,cSaveFile as String,nRatio AS Long
LOCAL nParaCount,oImage,cERROR,lIfError,cTimeFile
nParaCount=PARAMETERS()
IF nParaCount<2 OR nParaCount>3
    RETURN .F.
ENDIF
IF VARTYPE(cOpenFile)#"C" OR VARTYPE(cSaveFile)#"C"
    RETURN .F.
ENDIF 
IF nParaCount<3
    nRatio=20&&默认压缩比率为20%
ENDIF
IF nRatio<10
    nRatio=10
ENDIF
IF nRatio>100
    nRatio=100
ENDIF
nRatio=INT(nRatio)
IF !FILE(cOpenFile)
    RETURN .F.
ENDIF
lIfError=.T.
IF ALLTRIM(UPPER(cOpenFile))==ALLTRIM(UPPER(cSaveFile))
    cTimeFile=ADDBS(GETENV("TEMP"))+SYS(2015)+".TMP"
ELSE
    cTimeFile=ALLTRIM(UPPER(cSaveFile))
ENDIF
WAIT "图片压缩中..." WINDOW NOWAIT AT SROW()/2,(SCOLS()-len("图片压缩中..."))/2
cERROR=ON("ERROR")
ON ERROR lIfError=.F.
oImage=CREATEOBJECT("Gpimage")&&"c:\program files\microsoft visual foxpro 9\ffc\_gdiplus.vcx"
IF TYPE("oImage")#"O"
    *MESSAGEBOX("对象创建失败!",16,"")
ENDIF
IF !oImage.CreateFromFile(cOpenFile)
    *MESSAGEBOX("文件对象失败!",16,"")
ENDIF
IF !oImage.SaveToFile(cTimeFile,"image/jpeg","quality="+ALLTRIM(PADL(nRatio,3)))
    *MESSAGEBOX("压缩失败!",16,"")
    lIfError=.F.
ENDIF
RELEASE oImage
IF ALLTRIM(UPPER(cOpenFile))==ALLTRIM(UPPER(cSaveFile))
    =STRTOFILE(FILETOSTR(cTimeFile),cSaveFile)
ENDIF
ON ERROR &cERROR.
WAIT CLEAR
RETURN lIfError

9 楼

[quote]JPG图片压缩器.exe
确实将 jpg 压缩了,并保留了原尺寸不变。
是否可将vb源程序发给我![/quote]
cbl518老师,JPG图片压缩器.exe我没VB代码,只是现在VFP中找到类似于此功能的类,已经可以满足要求了.

10 楼

你是论坛第一个谈论使用 GDI+ 的!
看来你对 vfp 还很专一的,这样专一的人,目前比较少见!
如果在报表中加上 GDI+ 功能,
报表就特别实用和漂亮了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册