6

jpegtran.exeSmush.itなど、品質を犠牲にすることなく JPEG を最適化するツールがいくつかあります。コード (できれば .NET) を使用してそれを行う方法を探していましたが、現在は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 を最適化できないことについては混乱があります。未使用のメタデータを取り除くことができるので、短い答えははいです。私は圧縮について話しているのではありません。これらのスレッドを参照するか、Michael B の回答を確認してください。

更なるロスレス jpeg 圧縮のためのライブラリ

Windows 版の Smush.it はありますか?

画像圧縮ツール

Web で使用される画像のイメージ オプティマイザー (jpg、gif、png)

質問: FreeImage でそれを行うことはできますか。

4

4 に答える 4

2

私はFreeImageがロスレス変換のみをサポートしていると思います(つまりFreeImage_JPEGTransform)。

これにより別のファイルに保存できますが、残念ながら、新しいファイルに保存フラグを設定してメタデータなどを削除できるようにする方法はないようです。

ソースを見て、自分で利用できるものがあるかどうかを確認することをお勧めします。

于 2012-07-10T12:36:59.100 に答える
2

あなたが最適化について言及するとき、私は人々がほとんど圧縮について考えるのを見ます...

あなたが言及したプログラム(jpegtran)は、データを解凍して再圧縮することなく、jpeg画像を無損失で最適化できます。品質を落とさないのはそのためです。jpeg を最適化するためにできることは次のとおりです。

  • JPEG ファイルのハフマン コーディング レイヤーを最適化して、圧縮率を高めます。
  • プログレッシブ JPEG 形式と非プログレッシブ JPEG 形式の間の変換、
  • 一部の画像プログラムによって挿入された非標準のアプリケーション固有のデータを排除する
  • 品質を損なうことなくグレースケール、回転、トリミングを適用することもできますが、それには興味がないと思います。

出典:ウィキペディア。

私はそれをやったことがないので、手元に何もありませんが、あなたのためにそれを行うことができるライブラリがあると確信しています. それ以外の場合は、自分で何かを作成することはそれほど難しくありません。

于 2012-07-10T06:18:52.397 に答える
1

残念JPEGながら、損失のある形式です。小さなスケールでも。品質フラグは、損失が必要なスケールの場所を示します。損失が多いほど圧縮が良くなり、損失が少ないほどファイルが大きくなります。

  • JPEG/2000非可逆フォーマットを実行できますが、サポートされているほどではありません
  • PNG無損失圧縮をサポートします。

ただし、JPEG ファイルを最適化することはできますが、それでもデータが失われます。意味のないデータ (つまり、EXIF 情報) である可能性がありますが、これらの一部が失われます。サイズの増加は最小限です (ファイルがかなり小さい場合を除きます)。 . EXIF データを削除する方法に関するチュートリアルについては、こちらをご覧ください。

ただし、ファイルから最後の一滴までサイズを絞り込もうとする場合は、「より良い」形式に切り替える方がよいかもしれません (より良いまたはより悪い形式を定義したのはあなた自身の要件であるため、私はこの用語を大まかに使用しています)。しかし、より少ない損失でより高い圧縮をサポートする他の形式があります。

于 2012-07-09T22:01:33.690 に答える
1

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 (CS6 ではなく 6) をお持ちの場合は、PS6 SDK をインストールすると、関連情報が記載されたドキュメントを利用できます。

于 2013-09-05T14:33:16.680 に答える