Sign in to follow this  
Followers 0
qwert

Need assist to preserve JPG image quality

1 post in this topic

#1 ·  Posted

I'm scaling (down) a JPG and want to preserve the greatest possible quality level that's available in the original image.   This means—I think—that I need to write the downsized image with Quality = 100%.  (I'll mention that the original image is from a camera that uses a default quality setting of 90%, so it already has some level of compression.)

msdn explains it this way:

Quote

“To specify the compression level when you save a JPEG image, initialize an EncoderParameters object and pass the address of that object to the Save method of the Image class.”

I've looked at the following code from the GDI+ UDF and it seems to be passing the quality level from the original image ($sEncoder).  So, if I don't intervene, it seems it will be requesting a JPG quality of 90%, which would further compress the image.  Indeed, that's what seems to happen, because my written result is always smaller than what is produced by a 3rd party package that has quality set to 100% 

; #FUNCTION# ====================================================================================================================
; Author ........: Paul Campbell (PaulIA)
; Modified.......: Gary Frost
; ===============================================================================================================================
Func _GDIPlus_ImageSaveToFile($hImage, $sFileName)
    Local $sExt = __GDIPlus_ExtractFileExt($sFileName)
    Local $sCLSID = _GDIPlus_EncodersGetCLSID($sExt)
    If $sCLSID = "" Then Return SetError(-1, 0, False)

    Local $bRet = _GDIPlus_ImageSaveToFileEx($hImage, $sFileName, $sCLSID, 0)
    Return SetError(@error, @extended, $bRet)
EndFunc   ;==>_GDIPlus_ImageSaveToFile

; #FUNCTION# ====================================================================================================================
; Author ........: Paul Campbell (PaulIA)
; Modified.......: Gary Frost, jpm
; ===============================================================================================================================
Func _GDIPlus_ImageSaveToFileEx($hImage, $sFileName, $sEncoder, $tParams = 0)
    Local $tGUID = _WinAPI_GUIDFromString($sEncoder)
    Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipSaveImageToFile", "handle", $hImage, "wstr", $sFileName, "struct*", $tGUID, "struct*", $tParams)
    If @error Then Return SetError(@error, @extended, False)
    If $aResult[0] Then Return SetError(10, $aResult[0], False)

    Return True
EndFunc   ;==>_GDIPlus_ImageSaveToFileEx

All this is a good bit beyond my experience level with GDI+ and I will appreciate hearing from someone with knowledge of these considerations.

Thanks in advance.

 

Share this post


Link to post
Share on other sites



Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0