Public Function SaveJpgPicToFile(ByVal nPic As StdPicture, ByVal FileName As String, _
     ByVal nType As PicType ,   ByVal Quality As Byte  , _
     ByVal TIFF_ColorDepth As Long ,   ByVal TIFF_Compression As Long  ) As String
   
    Dim dl As Long, nGDIP As Long, nBMP As Long
    
    Dim nGSI As GdiplusStartupInput, B() As Byte
    
    On Error GoTo Cuo
    
    nGSI.GdiplusVersion = 1   ' 初始化 GDI+
    
    dl = GdiplusStartup(nGDIP, nGSI)
    
    If dl <> 0 Then SaveJpgPicToFile = "无法创建 GDI 图像": Exit Function
    
    dl = GdipCreateBitmapFromHBITMAP(nPic.Handle, 0, nBMP)
    
    If dl <> 0 Then GdiplusShutdown nGDIP: SaveJpgPicToFile = "不支持图片格式": Exit Function
    
    Dim mGUID As GUID, mEP As EncoderParameters      If LCase(Right(FileName, 4)) <> ".jpg" Then FileName = FileName & ".jpg"
    
    CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), mGUID
    
    mEP.Count = 1            
    With mEP.Parameter
    
       CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .nGUID         
       .NumberOfValues = 1
       .Type = 4       
       .Value = VarPtr(Quality)            
    End With
      
    ReDim B(1 To Len(mEP))
      
    Call CopyMemory(B(1), mEP, Len(mEP))
      
    dl = GdipSaveImageToFile(nBMP, StrPtr(FileName), mGUID, B(1))      
    GdipDisposeImage nBMP            
    GdiplusShutdown nGDIP            
    Exit FunctionCuo:   SaveJpgPicToFile = "错误 "   
End Function这是全部函数,我在屏幕截图后,用此保存成jpg图像没问题,就是在在运行此函数时,会造成有些应用程序的图像失真,比如我在后台运行定时截图,同时前台运行游戏帝国时代时,在发生截图时,此游戏中的草地和水均失真,造成丢色严重,保存图像质量我设置为15,我考虑是否由此引起的,可是如果是由此引起的,那么如何在截完图后恢复成正常值呢?请各位帮忙解决一下

解决方案 »

  1.   

    谢谢楼上的答复,我现在保存成JPG文件没问题,将图片质量设置成15,是为了减少文件大小,有利于做为邮件附件,一般情况下其它应用程序是不会出现图像失真现象,我是在偶然玩帝国时代三时发现在运行此函数时,游戏中的草地和水出现严重的失真,丢色严重,现在不知是什么原因造成的,考虑到是不是在将屏幕截图转换成jpg图片时,由于设置了图像质量较小,其它地方没有影响图像质量的,所以怀疑是不是由于设置了低质量的造成的,如果是由于这样造成的,那么在转换完后,如果恢复成正常值。疑问一:造成游戏中图像失真,是不是由于设置了保存图像质量低造成的?
    疑问二:如果是由于设置质量低造成的,如果解决?
    请赐教
      

  2.   

    经过断点调试,发现是由于此语句造成的GdiplusShutdown nGDIP       '销毁 GDI+
    为什么 销毁GDI时会造成屏幕内一下,其它应用程序中显示的图像失真
      

  3.   

    经过断点调试,发现是由于此语句造成的GdiplusShutdown nGDIP,如何每次不做销毁GDI+的话,每次的GDI+会占用多大内在,比如截取3000张图片可能会占用多大内在,如果占用内存不是很大的话,我可以采取不执行此语句暂来解决造成应用程序丢色的问题