VB6.0 GDI 保存JPG图片质量差问题
我在做一个图片处理软件。涉及图片压缩,格式转换等。
开发环境,WinXP+VB6.0,运用了GDI
用户在WinXP环境下,一切正常。
在Win7以上系统时,在VB6.0开发境中编译(包括全编译)时,仍然一切正常。
但生产exe文件后,当图片保存为JPG时,图片质量变得很差。如附图样子。
但是保存为BMP时没有这个问题。
我理解是不是操作系统的哪里不一样,影响了JPG保存的过程,
保存为JPG函数的函数如下:
处理出的图片样子:

求大神帮忙。。所有分数奉送。
开发环境,WinXP+VB6.0,运用了GDI
用户在WinXP环境下,一切正常。
在Win7以上系统时,在VB6.0开发境中编译(包括全编译)时,仍然一切正常。
但生产exe文件后,当图片保存为JPG时,图片质量变得很差。如附图样子。
但是保存为BMP时没有这个问题。
我理解是不是操作系统的哪里不一样,影响了JPG保存的过程,
保存为JPG函数的函数如下:
'*************************************************************************
'** 函 数 名 : funSaveImgToFile
'** 输 入 : pic(StdPicture) - 图象句柄
'** : FileName(String) - 保存路径
'** : Quality(Byte) - JPG图象质量
'** : TIFF_ColorDepth(Long) - TTF格式的颜色深度
'** : TIFF_Compression(Long) - TTF格式的压缩比
'** 输 出 : 成功与否
'** 功能描述 : 把图象保存为JPG、TIFF、PNG、GIF、BMP格式
'*************************************************************************
Public Function funSaveImgToFile(ByVal pict As StdPicture, ByVal FileName As String, ByVal PicType As String, _
Optional ByVal Quality As Byte = 100, _
Optional ByVal TIFF_ColorDepth As Long = 24, _
Optional ByVal TIFF_Compression As Long = 6) As Boolean
Dim tSI As GdiplusStartupInput
Dim lRes As Long
Dim lGDIP As Long
Dim lBitmap As Long
Dim aEncParams() As Byte
' 初始化 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标识
Select Case LCase(PicType) '防止前面写文件格式是把小写搞成大写,如果是就转为小写字
Case "jpg"
CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
tParams.Count = 1 ' 设置解码器参数
With tParams.Parameter ' Quality
CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID ' 得到Quality参数的GUID标识
.NumberOfValues = 1
.type = 4
.Value = VarPtr(Quality)
End With
ReDim aEncParams(1 To Len(tParams))
Call CopyMemory(aEncParams(1), tParams, Len(tParams))
Case "png"
CLSIDFromString StrPtr("{557CF406-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
ReDim aEncParams(1 To Len(tParams))
Case "gif"
CLSIDFromString StrPtr("{557CF402-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
ReDim aEncParams(1 To Len(tParams))
Case "tiff"
CLSIDFromString StrPtr("{557CF405-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
tParams.Count = 2
ReDim aEncParams(1 To Len(tParams) + Len(tParams.Parameter))
With tParams.Parameter
.NumberOfValues = 1
.type = 4
CLSIDFromString StrPtr("{E09D739D-CCD4-44EE-8EBA-3FBF8BE4FC58}"), .GUID ' 得到ColorDepth参数的GUID标识
.Value = VarPtr(TIFF_Compression)
End With
Call CopyMemory(aEncParams(1), tParams, Len(tParams))
With tParams.Parameter
.NumberOfValues = 1
.type = 4
CLSIDFromString StrPtr("{66087055-AD66-4C7C-9A18-38A2310B8337}"), .GUID ' 得到Compression参数的GUID标识
.Value = VarPtr(TIFF_ColorDepth)
End With
Call CopyMemory(aEncParams(Len(tParams) + 1), tParams.Parameter, Len(tParams.Parameter))
End Select
lRes = GdipSaveImageToFile(lBitmap, StrPtr(FileName), tJpgEncoder, aEncParams(1)) '保存图像
GdipDisposeImage lBitmap ' 销毁GDI+图像
End If
GdiplusShutdown lGDIP '销毁 GDI+
End If
Erase aEncParams
If lRes Then
funSaveImgToFile = False
Else
funSaveImgToFile = True
End If
Exit Function
End Function
处理出的图片样子:

求大神帮忙。。所有分数奉送。
...全文
相关推荐
VB60用 GDI+将图像章保存为JPG\TIFF\PNG\GIF\BMP等格式 作 者 : laviewpbt
VB60用 GDI+将图像章保存为JPG\TIFF\PNG\GIF\BMP等格式
VB6环境下PNG图片显示解决方案详解
VB6 是旧了,但它承载的业务逻辑往往是企业命脉。与其推倒重来,不如学会如何在这片“老土地”上种出新花。通过集成 GDI+,我们不仅解决了 PNG 支持问题,更重要的是掌握了一种思维方式:当语言能力不足时,要学会向操作系统借力。这种能力,远比某个具体功能更有价值。下次当你面对一个“不可能完成的任务”时,不妨问问自己:有没有哪个系统 API 正在默默等待被唤醒?毕竟,真正的高手,从来不怕用老工具做出新东西。🛠️✨“技术没有新旧之分,只有会不会用的区别。
VB6.0 在图片框中显示PNG图片
VB6.0 在图片框中显示PNG图片
用VB将剪切板中的图片保存为JPG文件\捕获屏幕快照的程序,可制作用户手册
用VB将剪切板中的图片保存为JPG文件\捕获屏幕快照的程序,可制作用户手册
vb 截屏并保存为jpg文件源码
vb 截屏并保存为jpg文件.源码,供参考


API
