2012-07-22 5 views
5

Questo è semplice come si ottiene. Crea un'immagine RGB, grande un pixel. Imposta il valore del pixel su (a, b, c). Salvare. Il problema è che l'immagine salvata ha un valore di pixel diverso (a, b, c). Di solito, con + -1 su uno dei canali, come se fosse un rumore casuale, ma coerente. Ecco il codice:PIL cambia il valore del pixel quando si salva

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] 

L'uscita da questo è: (0, 3, 0) (1, 3, 0)

coerente.

Se uso (4, 2, 0) come pixel per salvare l'uscita è: (4, 2, 0) (3, 2, 0)

e (0,10, 0) fornisce: (0, 10, 0) (0, 10, 1)

per esempio.

Perché il valore cambia al momento del salvataggio? Come lo prevengo? Per favore aiuto.

Grazie.

risposta

6

Salvarlo come .png. .jpg è un formato compresso con perdita.

+0

Grazie mille! Ti amo!!!! – void

3

JPG non promette di memorizzare con precisione i pixel desiderati. Comprime i dati per ridurre il file e la compressione si basa sulla percezione umana. L'idea è di creare una serie di pixel che appaiono uguali a un essere umano, anche se sono pixel diversi.

Quindi il pixel che si sta scrivendo è nell'output, ma i pixel adiacenti sono stati modificati per poter memorizzare l'intera immagine in meno spazio. Questo è chiamato "compressione con perdita" perché i dati sono persi.

Altri formati di immagine non hanno questa proprietà. PNG è un formato compresso senza perdita di dati, il che significa che esattamente gli stessi pixel risulteranno dopo la decompressione di un PNG compresso. Se salvi l'immagine come PNG, otterrai il risultato desiderato.

+0

voi ragazzi siete dannatamente geniali! Grazie! – Ethan

+0

Sì, voi ragazzi siete dannatamente sanguinosi ... Non pensavo a questo .. Ahh grazie! – void