10

これは簡単です。1ピクセル大きいRGB画像を作成します。ピクセル値を(a、b、c)に設定します。保存する。問題は、保存された画像のピクセル値が(a、b、c)と異なることです。通常、ランダムノイズであるかのように、チャネルの1つに+ -1がありますが、一貫性があります。コードは次のとおりです。

from PIL import Image
newImg = Image.new('RGB', (1,1), "black")
pixels = newImg.load()
pixels[0,0] = (0,3,0)
newImg.save("point.jpg")
savedImage = Image.open("point.jpg")
pixelsSaved = savedImage.load()

print pixels[0,0]
print pixelsSaved[0,0]

これからの出力は次のとおりです:(0、3、0)(1、3、0)

一貫して。

保存するピクセルとして(4、2、0)を使用すると、出力は次のようになります。(4、2、0)(3、2、0)

(0,10,0)は次のようになります:(0、10、0)(0、10、1)

例えば。

保存時に値が変わるのはなぜですか?どうすればそれを防ぐことができますか?助けてください。

ありがとう。

4

2 に答える 2

12

として保存します.png.jpg非可逆圧縮形式です。

于 2012-07-22T20:08:45.483 に答える
8

JPGは、意図したピクセルを正確に保存することを約束するものではありません。データを圧縮してファイルを小さくし、圧縮は人間の知覚に基づいています。アイデアは、異なるピクセルであっても、人間には同じように見えるピクセルの配列を作成することです。

したがって、書き込んでいるピクセルは出力に含まれますが、隣接するピクセルは、画像全体をより少ないスペースに格納できるように変更されています。データが失われるため、これは「不可逆圧縮」と呼ばれます。

他の画像形式にはこのプロパティがありません。PNGはロスレス圧縮形式です。つまり、圧縮されたPNGを解凍した後、まったく同じピクセルが生成されます。画像をPNGとして保存すると、希望する結果が得られます。

于 2012-07-22T23:26:57.513 に答える