7

JPEGを使った実験がいくつかありますが、ドキュメントには「100はJPEG量子化ステージを完全に無効にする」と書かれています。

ただし、保存中にピクセルが変更されました。これが私のコードです:

import Image
red = [20,30,40,50,60,70];
img = Image.new("RGB", [1, len(red)], (255,255,255))
pix = img.load()

for x in range(0,len(red)):
    pix[0,x] = (red[x],255,255)

img.save('test.jpg',quality=100)

img = Image.open('test.jpg')
pix = img.load()

for x in range(0,len(red)):
    print pix[0,x][0],

予期しない出力がありました:22 25 42 45 62 65 ピクセル値を保持するにはどうすればよいですか?私もimagejpegを使用してPHPを試しましたが、quality=100の場合に正しい値が得られることに注意してください。

保存するために使用できますpngが、その背後にある理由と、回避するオプションがあるかどうかを知りたいです

4

3 に答える 3

4

JPEGは常に損失のリスクを伴います。品質が100に設定されている場合、Jpegは損失がありませんか?を参照してください。

特に実験が科学用である場合は、別の形式を使用するのが最善の策です:) JPEGで開始する必要がある場合でも(可能性は低いと思われます)、あらゆる種類の分析と変更のために、すぐにロスレス形式に変換する必要があります。

本当にPythonでロスレスJPEGを試してみたい場合はjpegtran、「Independent Jpeg Groupのロスレスjpeg画像変換ソフトウェア」を試すことができますが、@ Markが指摘しているように、これではそれほど遠くはありません。

ちなみに、量子化は非可逆圧縮でも可逆圧縮でも同じように使用されるので、私の推測では

... 100は、JPEG量子化ステージを完全に無効にします。[1]

単にそれがまったく圧縮されていないことを意味します。

于 2013-03-18T15:56:26.850 に答える
4

JPEGは多くの異なるステップで構成されており、その多くはある程度の損失をもたらします。赤のみを含むサンプル画像を使用すると、おそらく最悪の犯罪者であるダウンサンプリングまたはクロマサブサンプリングに遭遇したことになります。目は色の変化よりも明るさの変化に敏感であるため、色情報の半分は破棄されます。

一部のJPEGエンコーダーは、を設定することにより、PILやPillowなどのサブサンプリングをオフにするように構成できますsubsampling=0。いずれにせよ、損失をもたらす他のステップがまだあるため、完全に損失のないファイルは提供されません。

于 2013-03-18T16:11:12.823 に答える
1

現在のカラーサブサンプリングやその他の品質の詳細を維持する方法を理解したと思います。

from PIL import Image, JpegImagePlugin as JIP

img = Image.open(filename)
img.save(
    filename + '2.jpg',                 # copy
    format='JPEG',
    exif=img.info['exif'],              # keep EXIF info
    optimize=True,
    qtables=img.quantization,           # keep quality
    subsampling=JIP.get_sampling(img),  # keep color res
)

https://www.exiv2.org/tags.htmlによると、 YCbCrSubSamplingタグがJPEGファイルのEXIFに保持されていないことがわかりました。

JPEG圧縮データでは、このタグの代わりにJPEGマーカーが使用されます。

これが、それをつかむために一見邪魔にならない場所に別の機能がある理由であるに違いありません。

于 2019-10-28T06:26:14.673 に答える