回答:
けれどもフィリップの答えは行くための最良の方法です、完全にJPEGの球体の中にあなたが欲しいものを行うことが可能です。
JPEGは、イメージを最小コーディング単位(MCU)と呼ばれるブロック(通常は各16 x 16)に分割し、それらを個別に圧縮することで機能します。圧縮レベルを非常に高く上げると、画像でこれを見ることができます。より合理的な圧縮レベルでは、ブロックは非常にスムーズにブレンドされるため、境界線は見えません。
この事実を利用して、単純な白い境界線を画像に可逆的に追加できます。出力画像サイズに等しい白いブロックの中空アレイを作成し、元のJPEG MCUブロックを中央にドロップするだけです。¹
この手法には欠点があります。入力および出力イメージのサイズが両方ともMCUサイズの偶数倍の場合にのみ機能します。そうでない場合は、白い境界線と元の画像の端の間のマージンでいくつかのブロックを再圧縮する必要があります。過度に高いJPEG圧縮レベルを避けた場合、出力にこの違いは見られないため、事実上ロスレスです。
私はこれだけを行うプログラムを知りません。私が知っている最も近いものは、逆の操作を行うものです:jpegtranには、画像のエッジの一部を無損失で切り取るトリミング機能があります。²画像のエッジに沿って切り取ったMCUを破棄し、中央はそのまま。
私が知っている最も簡単な既製のソリューションは、Photoshop用のBetter JPEG Lossless Resaveプラグインです。Photoshopが通常行うように、圧縮されていないバージョンからMCUを再作成することを避けるために、上記のアイデアに基づいた手法を使用して、可能な限り元のイメージからMCUをコピーします。³
余談:
JPEGの損失により出力に何らかの色の違いが生じるため、結果の境界線は完全に白ではないと考えるかもしれません。いくつかのテストを行いましたが、少なくともPhotoshopでは、Save For WebのJPEGレベル10(つまり「低」品質)で保存された純粋な白の画像は、依然として純粋な白のデコードされた画像になります。
私は2つのテストでこれを決定しました:
最初に、JPEGを元のレイヤーとしてレイヤーとしてロードし、トップレイヤーのブレンドモードを差分に設定し、その上にレベル調整レイヤーを追加して、差分を拡大しようとしました。結果の画像は黒のままで、「違いがない」ことを示しています。
第二に、予想される違いを確認できなかった場合、調整レイヤーをドロップし、JPEGレイヤーを通常のブレンドモードに戻し、スポイトツールを選択し、RGB(255,255,255)として表示されないピクセルの画像全体を探しました。 )情報パネルで。見つけたことがありません。画像をスクラブしたときに数字が少しちらつくのを期待していましたが、安定したままでした。
これは、エンコードアルゴリズムの縮退したケースであるとのみ結論付けることができます。純粋な白のブロックは、離散コサイン変換を通して白のままです。
興味深いことに、これは純粋な黒のブロックでは発生しません。少なくともPhotoshopの実装では、デコード時にRGB(0,0,0)ではなくRGB(1,1,1)になります。
要するに、上記の手法を使用して生成された画像を印刷するとき、この境界領域にドットがスパッタされることを心配する必要はありません。
jpegtran
はコマンドラインプログラムですが、と呼ばれる同じコードに基づいたGUI Windowsプログラムもありますjpegcrop
。
残念ながら、このプラグインはWindows専用です。
ここで覚えておくべきポイントは、写真を非可逆圧縮形式で保存すると品質が低下することです。境界線を追加した後、写真をロスレス形式(PSD、TIFFなど)で保存する限り、写真を最初にJPEGとして保存することで既に失ったデータよりも多くのデータを失うことはありません。
完全にロスレスではありませんが、GIMP(または同様の機能を備えた他のエディター)と次の2つのトリックを使用して、かなり近いものにすることができます。
まず、追加する境界線の幅が8ピクセルの倍数(そしてできれば16ピクセルの倍数)であることを確認します。
JPEG圧縮アルゴリズムは、画像を左上隅から8×8ピクセルのブロック *に分割し、各ブロックに独立して非可逆圧縮アルゴリズムを適用するため、これは重要です。したがって、少なくとも原則として、既存のブロックの周りに完全な8×8ピクセルブロックを追加することにより、JPEGイメージを無損失でパディングできます。ただし、ブロック全体の幅ではない境界線を追加しようとすると、パディングされたイメージのブロックは元のブロックと整列せず、圧縮損失が避けられません。
*)実際、ほとんどのJPEG画像はクロマサブサンプリングを使用します。これは、画像のグレースケール部分のみが実際に8×8ブロックで圧縮されるのに対し、クロマチャンネルは圧縮前に50%縮小され、有効ブロックサイズが16×になることを意味します16ピクセル。したがって、最良の結果を得るには、境界線の幅を実際に16ピクセルの倍数にする必要があります。ただし、通常、8(または24または40など)ピクセルの境界線で回避できます。これは、クロマの圧縮損失が少し目立たないためです。
トリックの2番目の部分は、最終画像を保存するときに、[ 画像をJPEGとしてエクスポート]ダイアログ([詳細設定]の下)で[ 元の画像の品質設定を使用]チェックボックスを選択することです。通常使用するよりも品質が低下すると思われる場合でも、これを行ってください!
この設定では、GIMPは、元の画像のために使用されたとまったく同じ圧縮設定を再利用になり、通常は、圧縮損失の約99%を排除することを提供し、あなたはあまりにも重く、画像を編集していない、特に内のブロックということ新しい画像は元の画像とまだ並んでいます。(丸め誤差による損失がまだある場合がありますが、そうでない場合よりもはるかに少なくなります。)
簡単なデモンストレーションとして、このJPEGテスト画像をWikimedia Commonsから取得し、もともとは50のかなり低い品質設定で保存し、上記の方法を使用して空想的な(並べ替えの)8px白黒ボーダーを追加しました。
GIMPの「Grain extract」レイヤーモードを使用して表示される、元の画像(15.1 kB)と編集された画像(16.7 kB)の違いを次に示します。
境界幅が16の倍数ではないことに起因する非常にわずかなクロマエラーと、(よく見ると)丸めのために輝度チャンネルにわずかな損失があったいくつかのブロックを見ることができます。それでも、視覚的には、元の画像とパディングされた画像は、2倍の倍率で交互に反転してもほとんど区別できません。
特に、これは、パディングされた画像を保存する前にJPEGの品質を50から60に上げた結果と対照的で、次の17.6 kBの画像が生成されます。
高倍率では、編集された画像が元の画像よりも著しくぼやけていることがはっきりとわかります。グレインエキスとの違いを確認すると、これが確認できます。
これがまさにあなたが望んでいたものではない場合は申し訳ありませんが...
印刷時に画像を配置するための補助として白い境界線を追加するように聞こえます。印刷インターフェイスを適切に学習することに集中し、このような危険なハッキングを避けてみませんか?これがもたらす他の問題は、印刷プログラムが正しいDPI /解像度に合うように4680x3120画像のサイズを変更できるようにすることです。これは、JPEGを再保存するよりも深刻な影響を与える可能性があります。
前の答えは非常に良いです。
jpg形式の「心理的側面」をいくつか追加します。
jpgの準備が整っていれば、約0.5%の情報しか失われません。それは、ほとんどの場合、人間の目では見ることができないものです。何らかの分析を行い、違いを確認するプログラムが必要です(Ilmariが行った分析のように)。
「高品質」は、ファイル形式が画像を保存する方法だけでなく、プロセスです。はい、本当に必要なため、もう一度jpgでファイルを再圧縮しました。制御された状況にある場合、それを行うことは問題ありません。
あなたは本当にそれはあなたが非常に特定のストレージやソフトウェアのニーズ、または非常にタイトなワークフローを持って、別のロスレスフォーマットを使用できないことを意味し必要。
品質に本当に関心がある場合は、おそらくペイントを使用しないでしょう。JPG形式には、ペイントではまったく制御できない構成がいくつかあります。
これは、jpg圧縮を本当に制御できる無料プログラムのリストと、選択する必要があるオプションです。(それらはすべてjpg保存ダイアログにあります)
Irfanview-クロマカラーサブサンプリングを無効にします。
FastStone Image Viewer-色のサブサンプリング:なし。
Gimp-サブサンプリング4:4:4
結論。ペイントを使用しないでください。
まだ確認していないことがあります。これらすべてのプログラムが埋め込みカラープロファイルを維持している場合。後で投稿を編集します。
IrfanViewは、一連の画像でうまく機能します。ここにいくつかのハウツーノートがあります
ボーダー挿入のためのストアドプロシージャを次に示します-ボーダーを追加するInfranプロシージャ