首页 文章

使用FreeImage对JPEG进行无损优化

提问于
浏览
6

有几种工具可以在不牺牲质量的情况下优化JPEG,例如jpegtran.exeSmush.it . 我've been looking for a way to do it through code (preferably in .NET) and I'目前已定居FreeImage但我没有得到我想要的结果 .

有一个 JPEG_OPTIMIZE 标志,但你必须设置一个质量标志,然后它不再是无损的 .

这是我试过的:

var image = FreeImage.Load(FREE_IMAGE_FORMAT.FIF_JPEG, fileIn, FREE_IMAGE_LOAD_FLAGS.JPEG_ACCURATE);
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, image, fileOut, FREE_IMAGE_SAVE_FLAGS.JPEG_OPTIMIZE);

但它会进行压缩 . 我认为FreeImage可以优化(通过剥离元数据等),但我找不到如何保持相同的压缩/图像质量 . 这样做的正确方法是什么?

编辑:有一些关于无法优化JPEG的混淆,简短的回答是肯定的,因为你可以删除未使用的元数据 . 我是_1354389的答案 .

Library for further lossless jpeg compression

Is there a Windows version of Smush.it available?

Tool for Image compression

Image Optimizer for images used on the web (jpg, gif and png)

问题是:可以用FreeImage完成,如果是这样的话:怎么做?

4 回答

  • 1

    我认为FreeImage只支持无损 transformations (即 FreeImage_JPEGTransform ) .

    这可以保存到不同的文件,但不幸的是,似乎没有办法在新文件上设置任何保存标志以允许剥离元数据等 .

    我只能建议您查看来源,看看是否有什么可以自己利用 .

  • 2

    当你提到优化时,我看到人们主要考虑压缩...

    您提到的程序(jpegtran)可以无损地优化jpeg图像,而无需解压缩和重新压缩数据 . 这就是为什么你不放松质量的原因 . 你可以做些什么来优化jpeg:

    • 优化JPEG文件的霍夫曼编码层以增加压缩,

    • 在渐进式和非渐进式JPEG格式之间进行转换,

    • 消除了某些图像程序插入的非标准应用程序特定数据

    • 你也可以在不损失质量的情况下应用灰度,旋转或裁剪,但我猜你对此并不感兴趣 .

    资料来源:维基百科 .

    我从来没有这样做过,所以手边没有任何东西,但我确信有一个库可以为你做到这一点 . 否则,自己制作一些东西不应该那么困难 .

  • 1

    我害怕 JPEG 是一种有损格式 . 即使规模很小 . 质量标志告诉它你想要损失的规模,压缩越多,文件越大,损失越小 .

    • JPEG/2000 可以执行非有损格式,但不完全支持

    • PNG 支持无损压缩 .

    然而,您可以优化JPEG文件,但这仍然会导致数据丢失,它可能是无意义的数据(即EXIF信息),但它会丢失其中一些,大小增益很小(除非您的文件已经非常小) . 有关如何删除EXIF数据的教程,请查看here .

    但是,如果你试图从文件中挤出最后一滴大小,你可能会更好地切换到“更好”的格式(我会松散地使用这个术语,因为定义更好或更差的格式是你自己的要求) . 但是还有其他格式支持更高的压缩而损失更少 .

  • 2

    您可以使用FreeImage删除元数据,但是,对于jpeg,图像将在保存时重新压缩,并伴随相关的图像质量损失 .

    ' by default, FreeImage will have copied the metadata to the new image
    If Not (args.CopyMetadata) Then
        Dim tag As New FreeImageAPI.FITAG
        FreeImage.SetMetadata(FREE_IMAGE_MDMODEL.FIMD_COMMENTS, dib2, Nothing, tag)
        FreeImage.SetMetadata(FREE_IMAGE_MDMODEL.FIMD_IPTC, dib2, Nothing, tag)
        FreeImage.SetMetadata(FREE_IMAGE_MDMODEL.FIMD_XMP, dib2, Nothing, tag)
        ' value of 11 is for FIMD_EXIF_RAW
        FreeImage.SetMetadata(DirectCast(11, FreeImageAPI.FREE_IMAGE_MDMODEL), dib2, Nothing, tag)
        FreeImage.DeleteTag(tag)
    End If
    
    If File.Exists(targetFile) Then
        File.Delete(targetFile)
    End If
    
    FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, dib2, targetFile, FREE_IMAGE_SAVE_FLAGS.JPEG_OPTIMIZE Or FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYGOOD)
    

    如果要从FIF_JPEG以外的文件类型中删除元数据,则应查阅文档以查看哪些文件是可写的 .

    要在不影响图像的情况下删除元数据,您需要查看jpeg文件交换格式并仅提取所需的数据 . 如果您碰巧安装了Photoshop 6安装CD(6而不是CS6),则在安装PS6 SDK时可以获得包含相关信息的文档 .

相关问题