品質に影響を与えずにJPEG写真に境界線を追加するにはどうすればよいですか?


24

解像度4680x3120のJPEG形式の写真があります。この写真の周りに白い境界線を追加して、5200x3467写真に変換したい(印刷上の理由から)。

明らかに、写真を変更したり削除したりするのではなく、単に何かを追加するだけです。したがって、原則として、この手順はロスレスです。ただし、ペイントを使用してこの境界線を追加すると、ペイントの保存プロセスによって写真が再びJPEG形式に圧縮され、情報と品質が失われます。

写真の元の部分に影響を与えることなく、品質を落とすことなく、JPEG写真に境界線などの何かを追加する方法(より専門的なプログラム)はありますか?

回答:


35

けれどもフィリップの答えは行くための最良の方法です、完全にJPEGの球体の中にあなたが欲しいものを行うことが可能です。

JPEGは、イメージを最小コーディング単位(MCU)と呼ばれるブロック(通常は各16 x 16)に分割し、それらを個別に圧縮することで機能します。圧縮レベルを非常に高く上げると、画像でこれを見ることができます。より合理的な圧縮レベルでは、ブロックは非常にスムーズにブレンドされるため、境界線は見えません。

この事実を利用して、単純な白い境界線を画像に可逆的に追加できます。出力画像サイズに等しい白いブロックの中空アレイを作成し、元のJPEG MCUブロックを中央にドロップするだけです。¹

この手法には欠点があります。入力および出力イメージのサイズが両方ともMCUサイズの偶数倍の場合にのみ機能します。そうでない場合は、白い境界線と元の画像の端の間のマージンでいくつかのブロックを再圧縮する必要があります。過度に高いJPEG圧縮レベルを避けた場合、出力にこの違いは見られないため、事実上ロスレスです。

私はこれだけを行うプログラムを知りません。私が知っている最も近いものは、逆の操作を行うものです:jpegtranには、画像のエッジの一部を無損失で切り取るトリミング機能があります。²画像のエッジに沿って切り取ったMCUを破棄し、中央はそのまま。

私が知っている最も簡単な既製のソリューションは、Photoshop用のBetter JPEG Lossless Resaveプラグインです。Photoshopが通常行うように、圧縮されていないバージョンからMCUを再作成することを避けるために、上記のアイデアに基づいた手法を使用して、可能な限り元のイメージからMCUをコピーします。³


余談:

  1. JPEGの損失により出力に何らかの色の違いが生じるため、結果の境界線は完全に白ではないと考えるかもしれません。いくつかのテストを行いましたが、少なくともPhotoshopでは、Save For WebのJPEGレベル10(つまり「低」品質)で保存された純粋な白の画像は、依然として純粋な白のデコードされた画像になります。

    私は2つのテストでこれを決定しました:

    最初に、JPEGを元のレイヤーとしてレイヤーとしてロードし、トップレイヤーのブレンドモードを差分に設定し、その上にレベル調整レイヤーを追加して、差分を拡大しようとしました。結果の画像は黒のままで、「違いがない」ことを示しています。

    第二に、予想される違いを確認できなかった場合、調整レイヤーをドロップし、JPEGレイヤーを通常のブレンドモードに戻し、スポイトツールを選択し、RGB(255,255,255)として表示されないピクセルの画像全体を探しました。 )情報パネルで。見つけたことがありません。画像をスクラブしたときに数字が少しちらつくのを期待していましたが、安定したままでした。

    これは、エンコードアルゴリズムの縮退したケースであるとのみ結論付けることができます。純粋な白のブロックは、離散コサイン変換を通して白のままです。

    興味深いことに、これは純粋な黒のブロックで発生しませ。少なくともPhotoshopの実装では、デコード時にRGB(0,0,0)ではなくRGB(1,1,1)になります。

    要するに、上記の手法を使用して生成された画像を印刷するとき、この境界領域にドットがスパッタされることを心配する必要はありません。

  2. jpegtranはコマンドラインプログラムですが、と呼ばれる同じコードに基づいたGUI Windowsプログラムもありますjpegcrop

  3. 残念ながら、このプラグインはWindows専用です。


1
このような機能を提供するJPEGウィザードと呼ばれるプログラムを使用しました。また、JPEGのさまざまな部分にさまざまな圧縮率を適用できる非常に優れた機能も備えていました。したがって、人の頭と手には高品質の設定を、衣服には中品質の、背景には低品質の設定を使用する可能性があります。そのため、すべてに中品質を使用した場合よりもファイルは小さくなりますが、全体的な品質は向上します。
-supercat

1
試してみる機会はありませんでしたが、このブログ投稿では、jpegtranのトリミング機能を実際に使用して拡張することもできます。(ただし、拡張された境界線が最終的にどの色になるかは
わかり

4
@mattdm:はい、jpegtran画像を拡張することもできますが、常にハードコーディングされたミドルグレーRGB(128,128,128)が埋め込まれます。これは、DCT係数空間では簡単なbzero()呼び出しで実行できるため、これが唯一の簡単なオプションだからです。私はこれを変更する際に野生のハックを試みましたが、うまくいきませんが、関係するugさの感覚を与える必要があります。欲求不満で手を投げる
ウォーレンヤング

@WarrenYoung:パディングブロックの色を変更するには、おそらく最初の(DC)係数だけを変更し、その他はゼロのままにする必要があります。もちろん、係数は圧縮されているので...とにかく、実行可能でなければなりませんが、見かけほど簡単ではないことに同意します。
イルマリカロネン

2
あなたの最後の点に関しては、最大の節約は、高頻度の情報を捨てることです。ピクセルの固体ブロックの色の精度を捨てることによる利得は、1〜2バイトを超えることはないため、まったくまたはほとんど実行されません。情報の損失がある場合、YUV <-> RGB色空間変換にあります。
ホッブズ

20

ここで覚えておくべきポイントは、写真を非可逆圧縮形式で保存すると品質が低下することです。境界線を追加した後、写真をロスレス形式(PSD、TIFFなど)で保存する限り、写真を最初にJPEGとして保存することで既に失ったデータよりも多くのデータを失うことはありません。


1
ありがとう。そして、これは、ペイントのような「くだらない」プログラムを使用しているとき、例えばTIFFに保存するときにも当てはまりますか?
LBogaardt

4
少なくとも私のクイックテストによると、ペイントはTIFFを保存するときにロスレスLZW圧縮アルゴリズムを使用するため、見た目は問題ありません。
フィリップケンドール

5
...これはおそらく大幅に画像のサイズを大きくすることであることを覚えておいてください
BlueRaja -ダニーPflughoeft

2
ペイントはPNGもサポートします。これもロスレス形式です
-phuclv

jpegへの保存について説明する回答は、すべてのjpegエンコードオプションと互換性がないため、+ 1を使用します。
ジェームス・スネル

6

完全にロスレスではありませんが、GIMP(または同様の機能を備えた他のエディター)と次の2つのトリックを使用して、かなり近いものにすることができます。

  1. まず、追加する境界線の幅が8ピクセルの倍数(そしてできれば16ピクセルの倍数)であることを確認します。

    JPEG圧縮アルゴリズムは、画像を左上隅から8×8ピクセルのブロック *に分割し、各ブロックに独立して非可逆圧縮アルゴリズムを適用するため、これは重要です。したがって、少なくとも原則として、既存のブロックの周りに完全な8×8ピクセルブロックを追加することにより、JPEGイメージを無損失でパディングできます。ただし、ブロック全体の幅ではない境界線を追加しようとすると、パディングされたイメージのブロックは元のブロックと整列せず、圧縮損失が避けられません。

    *)実際、ほとんどのJPEG画像はクロマサブサンプリングを使用します。これは、画像のグレースケール部分のみが実際に8×8ブロックで圧縮されるのに対し、クロマチャンネルは圧縮前に50%縮小され、有効ブロックサイズが16×になることを意味します16ピクセル。したがって、最良の結果を得るには、境界線の幅を実際に16ピクセルの倍数にする必要があります。ただし、通常、8(または24または40など)ピクセルの境界線で回避できます。これは、クロマの圧縮損失が少し目立たないためです。

  2. トリックの2番目の部分は、最終画像を保存するときに、[ 画像をJPEGとしてエクスポート]ダイアログ[詳細設定]の下)で[ 元の画像の品質設定を使用]チェックボックスを選択することです。通常使用するよりも品質が低下すると思われる場合でも、これを行ってください!

    この設定では、GIMPは、元の画像のために使用されたとまったく同じ圧縮設定を再利用になり、通常は、圧縮損失の約99%を排除することを提供し、あなたはあまりにも重く、画像を編集していない、特に内のブロックということ新しい画像は元の画像とまだ並んでいます。(丸め誤差による損失がまだある場合がありますが、そうでない場合よりもはるかに少なくなります。)


簡単なデモンストレーションとして、このJPEGテスト画像をWikimedia Commonsから取得し、もともとは50のかなり低い品質設定で保存し、上記の方法を使用して空想的な(並べ替えの)8px白黒ボーダーを追加しました。

ほとんどがロスレスの8pxボーダーのテスト画像

GIMPの「Grain extract」レイヤーモードを使用して表示される、元の画像(15.1 kB)と編集された画像(16.7 kB)の違いを次に示します。

パディングされた画像とオリジナルの違い

境界幅が16の倍数ではないことに起因する非常にわずかなクロマエラーと、(よく見ると)丸めのために輝度チャンネルにわずかな損失があったいくつかのブロックを見ることができます。それでも、視覚的には、元の画像とパディングされた画像は、2倍の倍率で交互に反転してもほとんど区別できません。

特に、これは、パディングされた画像を保存する前にJPEGの品質を50から60に上げた結果と対照的で、次の17.6 kBの画像が生成されます。

8ピクセルの境界線を持つテスト画像、品質を50から60に上げました

高倍率では、編集された画像が元の画像よりも著しくぼやけていることがはっきりとわかります。グレインエキスとの違いを確認すると、これが確認できます。

パディングされた画像(q60)とオリジナルの違い


「このチェックボックスを選択しても、「プログレッシブ」設定には影響しないようです。」プログレッシブエンコーディングはエンコーディング設定であり、品質設定ではないため、バグではありません。Jpegtranは、プログレッシブロスレスで画像を変換できます。
ダミアンジェリック

@tepples:そのとおりです。その段落を削除しました。何らかの理由で、プログレッシブモードを切り替えると品質設定が一致しなくなるという印象を受けましたが、簡単なテストで、それについて間違っていることが確認されたようです。
イルマリカロネン

1
@thomasrutter:コメントを降格することはできません。そのため、この機能を説明する元のフォーラム投稿、特に次の引用を紹介します。「画像に少しだけ変更を加えた場合は、同じ量子化テーブルを使用すると、元の画像ですあなたに、ほぼ同じ品質とファイルサイズを提供します。これは、あなたが別の量子化テーブルを使用した場合に何が起こるかと比較して、量子化ステップによる損失を最小限に抑えることができます。。 "
イルマリKaronen

1
比較のために、別の質問に対する回答の別の例を示します。理論上の私の理解はIlmariに同意しますが、少なくとも私の例では、少なくとも高度に劣化したイメージから始める場合は、トーマスの言うことを実践しているようです。(墓石は、人間の肌よりも石の細部の喪失が目立たないため、この目的のために悪い例になると思います。)
mattdm

1
@mattdm:かなりソフトウェアに依存しているようです。その回答から得られた結果をGIMPで再現しようとしましたが、GIMP(少なくともv2.8.10)はImageMagick(テストしたバージョン)よりもJPEG品質の保持においてかなり優れているようです。q75で1回保存された最初の画像のPSNRは34.0298であり、q75で2回保存された画像は32.8169の1つです(8回保存された画像のPSNRは32.6459です)。これに対して、同じソースイメージをGIMPでq75に一度保存すると、PSNRは36.4560になります。同じ品質で開いて再保存すると、わずかに低下して36.3295になります。
イルマリカロネン

3

これがまさにあなたが望んでいたものではない場合は申し訳ありませんが...

印刷時に画像を配置するための補助として白い境界線を追加するように聞こえます。印刷インターフェイスを適切に学習することに集中し、このような危険なハッキングを避けてみませんか?これがもたらす他の問題は、印刷プログラムが正しいDPI /解像度に合うように4680x3120画像のサイズを変更できるようにすることです。これは、JPEGを再保存するよりも深刻な影響を与える可能性があります。


両方の有効な点、ありがとう。ただし、オンラインプリントショップの1つに写真をアップロードしたため、実際のプリンターを制御することはできません。
LBogaardt

1

前の答えは非常に良いです。

jpg形式の「心理的側面」をいくつか追加します。

jpgの準備が整っていれば、約0.5%の情報しか失われません。それは、ほとんどの場合、人間の目では見ることができないものです。何らかの分析を行い、違いを確認するプログラムが必要です(Ilmariが行った分析のように)。

「高品質」は、ファイル形式が画像を保存する方法だけでなく、プロセスです。はい、本当に必要なため、もう一度jpgでファイルを再圧縮しました。制御された状況にある場合、それを行うことは問題ありません。

あなたは本当にそれはあなたが非常に特定のストレージやソフトウェアのニーズ、または非常にタイトなワークフローを持って、別のロスレスフォーマットを使用できないことを意味し必要。

品質に本当に関心がある場合は、おそらくペイントを使用しないでしょう。JPG形式には、ペイントではまったく制御できない構成がいくつかあります。

これは、jpg圧縮を本当に制御できる無料プログラムのリストと、選択する必要があるオプションです。(それらはすべてjpg保存ダイアログにあります)

Irfanview-クロマカラーサブサンプリングを無効にします。

FastStone Image Viewer-色のサブサンプリング:なし。

Gimp-サブサンプリング4:4:4

結論。ペイントを使用しないでください。

まだ確認していないことがあります。これらすべてのプログラムが埋め込みカラープロファイルを維持している場合。後で投稿を編集します。


この回答で誰かが-1を投票しました。通常、私は何か愚かなことを言うことができるので気にしません。この特定のケースでは、答えのどの部分が間違っていますか?
ラファエル

私は投票(アップまたはダウン)しませんでしたが、あなたは可能性がより良い第一印象を与えるためにあなたのスペルや文法上の仕事をしたい(とも、正直、読むことがあなたの答えを容易にするために)。また、この質問にはすでにいくつかの答えがあります(特に私の質問はかなり長いことが判明しました)。ある時点で、一部の人々は、既存の回答に新しいものを明確に追加しない回答をダウン投票する(または少なくともアップ投票しない)場合があります。また、重要な部分が一目で目立つように回答を構成してください。この場合、太字強調表示した部分は重要でない脚注のみです。
イルマリカロネン

コメントIlmariに感謝します。私の母国語ではないので、英語で考えるのに苦労しています。スペルチェックツールを探します。文法があるかどうかはわかりません。-コメントの2番目の部分について、StackExchangeの背後にあるロジックは、質問の回答を個別に回答すること、回答の流れが固定されていないこと、順序の変更や編集が可能であることを理解しています。それについて見ていきます。(太字のテキストを削除しました)再びありがとう。:o)
ラファエル

1
「約0.5%の情報しか失わない」[要出典] :)
ウォーレンヤング

ちょっとウォーレン、ここにあります:otake.com.mx/Apuntes/PruebasDeCompresion2 / ...スペイン語です。今のところgoogle translateを使用してください。更新する必要があります。実際、0.392%未満です:)
ラファエル

0

IrfanViewは、一連の画像でうまく機能します。ここにいくつかのハウツーノートがあります

ボーダー挿入のためのストアドプロシージャを次に示します-ボーダーを追加するInfranプロシージャ

  1. 右クリック画像、「アプリケーションで開く」->「InfranView」
  2. 「b」を押す
  3. 左上の[詳細オプションを使用する]をオンにし、[詳細]を押します
  4. 「キャンバスサイズ」をチェックし、「設定」を押します
  5. 各境界線の幅を入力します(左側、右側、上側、下側)
  6. 「OK」を押します
  7. 「既存のファイルを上書きする」を選択します
  8. 「OK」を押します
  9. 出力ディレクトリ「結果ファイルの出力ディレクトリ:」を入力します
  10. 画像に移動してダブルクリックし、上部のリストで境界線を追加します。これにより、下部のリストの「入力ファイル:」リストに追加されます
  11. 「バッチ開始」を押します

1
画像の品質を低下させないというポスターの要件を満たすために、これらの方法の特別な点を説明してください。最初に読むと、これは、ポスターが回避しようとしている解凍-再圧縮サイクル全体を通してJPEGを送信するように見えます。
フィリップケンドール

うーん、ここに挙げたプロセスを通じて、イメージのライフサイクルに関して興味深い点を教えてください、それについては考えていませんでした。私の投稿を削除または修正したい場合は、正しいかもしれません:))!
J-Dizzle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.