Come posso aggiungere un bordo a una foto JPEG senza influire sulla qualità?


24

Ho una foto in formato JPEG con risoluzione 4680x3120. Voglio aggiungere un bordo bianco attorno a questa foto, trasformandola in una foto 5200x3467 (per motivi di stampa).

Chiaramente, non sto alterando o rimuovendo nulla dalla foto, sto semplicemente aggiungendo qualcosa. Pertanto, in linea di principio questa procedura può essere senza perdite. Tuttavia, se dovessi usare Paint per aggiungere questo bordo, il processo di salvataggio di Paint comprimerà nuovamente la foto nel formato JPEG, perdendo così informazioni e qualità.

C'è un modo (qualche programma più professionale) per aggiungere qualcosa a una foto JPEG, come un bordo, senza influire sulla parte originale della foto, senza ridurne la qualità?

Risposte:


35

Sebbene la risposta di Philip sia il modo migliore per procedere, è possibile fare ciò che desideri interamente nell'ambito di JPEG.

JPEG funziona suddividendo l'immagine in blocchi chiamati Minimum Coding Unit (MCU), in genere 16 × 16 ciascuno, e comprimendoli separatamente. Puoi vederlo nelle immagini quando aumenti il ​​livello di compressione molto in alto. A livelli di compressione più ragionevoli, i blocchi si fondono così uniformemente da non vedere mai i bordi.

Possiamo trarre vantaggio da questo fatto per aggiungere senza perdita di bordi un semplice bordo bianco a un'immagine. Dobbiamo semplicemente creare una matrice vuota di blocchi bianchi pari alla dimensione dell'immagine di output, quindi rilasciare i blocchi MCU JPEG originali nel mezzo .¹

C'è un aspetto negativo di quella tecnica: funziona solo quando le dimensioni dell'immagine di input e output sono entrambe un multiplo pari della dimensione MCU. In caso contrario, è necessario ricomprimere alcuni dei blocchi al margine tra il bordo bianco e i bordi dell'immagine originale. Non vedrai questa differenza nell'output se stai lontano dai livelli di compressione JPEG eccessivamente alti, quindi è ancora efficacemente senza perdita.

Non sono a conoscenza di alcun programma che fa solo questo. La cosa più vicina di cui sono a conoscenza è qualcosa che fa l'operazione inversa: jpegtran ha una funzione di ritaglio che taglia senza perdita di parti parti dei bordi dell'immagine. Lo fa scartando gli MCU ritagliati lungo i bordi dell'immagine, lasciando quelli in il mezzo intatto.

La soluzione ready-made più semplice di cui sono a conoscenza è il plug-in Better JPEG Lossless Resave per Photoshop. Utilizza tecniche basate sulle idee sopra riportate per copiare gli MCU dall'immagine originale ovunque possibile, al fine di evitare di ricrearli dalla versione non compressa, come fa normalmente Photoshop.


digressioni:

  1. Potresti pensare che il bordo risultante non sarà del tutto bianco , poiché la perdita di JPEG creerà una sorta di differenza di colore nell'output. Ho fatto alcuni test e, almeno in Photoshop, un'immagine puramente bianca salvata tramite il livello JPEG 10 di Save For Web (ovvero "bassa" qualità) si traduce in un'immagine decodificata che è ancora puramente bianca.

    Ho determinato questo con due test:

    Innanzitutto, ho caricato il JPEG come livello sopra l'originale, ho impostato la modalità di fusione del livello superiore su Differenza, quindi ho aggiunto un livello di regolazione Livelli sopra di esso per cercare di ingrandire le differenze. L'immagine risultante è rimasta nera, indicando "nessuna differenza".

    In secondo luogo, quando non sono riuscito a vedere le differenze attese, ho lasciato cadere il livello di regolazione e riportato il livello JPEG in modalità di fusione Normale, ho preso lo strumento contagocce e ho cercato in tutto l'immagine un pixel che non era mostrato come RGB (255.255.255 ) nel pannello Informazioni. Non ne ho mai trovato uno. Mi aspettavo di vedere un leggero sfarfallio dei numeri mentre strofinavo sull'immagine, ma rimasero fermi.

    Posso solo concludere che questo è un caso degenerato dell'algoritmo di codifica: i blocchi bianchi puri rimangono bianchi attraverso la trasformazione del coseno discreta .

    È interessante notare che questo non accade con blocchi neri puri. Almeno con l'implementazione di Photoshop, si trasformano in RGB (1,1,1) quando vengono decodificati, non RGB (0,0,0).

    In conclusione, non è necessario preoccuparsi dei punti sputtered in questa area del bordo quando si stampa un'immagine prodotta utilizzando la tecnica sopra.

  2. jpegtranè un programma da riga di comando, ma esiste anche un programma Windows GUI basato sullo stesso codice chiamato jpegcrop.

  3. Purtroppo, questo plugin è solo per Windows.


1
Ho usato un programma chiamato JPEG Wizard che forniva tale funzionalità. Ha anche avuto un'ottima capacità di applicare diversi rapporti di compressione a diverse parti di un JPEG. Si potrebbe quindi utilizzare un'impostazione di alta qualità per la testa e le mani di una persona, una qualità media per i suoi vestiti e una qualità inferiore per lo sfondo, e quindi finire con un file più piccolo ma una qualità generale migliore rispetto a se si fosse usata una qualità media per tutto.
supercat

1
Non ho avuto la possibilità di provarlo, ma questo post sul blog suggerisce che jpegtranla funzione di ritaglio può effettivamente essere utilizzata anche per estenderla. (Non sono sicuro di che colore finiscano per essere i bordi estesi, però.)
mattdm

4
@mattdm: Sì, jpegtranpuò anche estendere l'immagine, ma si adatta sempre con un grigio medio codificato, RGB (128.128.128). Lo fa semplicemente perché è l'unica opzione facile, poiché nello spazio dei coefficienti DCT, puoi farlo con una semplice bzero()chiamata. Ho provato un trucco selvaggio a cambiare questo , che non funziona, ma dovrebbe darti un senso della bruttezza in questione. solleva le mani frustrato
Warren Young

@WarrenYoung: per cambiare il colore dei blocchi di imbottitura, presumibilmente dovresti cambiare solo il primo coefficiente (DC) e lasciare gli altri a zero. Certo, i coefficienti sono compressi, quindi ... comunque, dovrebbe essere fattibile, ma sono d'accordo che non è così banale come potrebbe sembrare.
Ilmari Karonen,

2
Per quanto riguarda il tuo ultimo punto, la maggiore quantità di risparmi deriva dal lancio di informazioni ad alta frequenza. Il guadagno derivante dalla riduzione della precisione sul colore di un solido blocco di pixel non potrebbe essere superiore a uno o due byte, quindi non viene mai o quasi mai fatto. Se c'è una perdita di informazioni è nella conversione dello spazio colore YUV <-> RGB.
Hobbs

20

Il punto da ricordare qui è che si perde qualità quando si salva la foto in un formato di compressione con perdita. Finché si salva la foto in un formato senza perdita di dati (PSD, TIFF, ecc.) Dopo aver aggiunto il bordo, non si perderanno più dati di quelli già persi salvando la foto come JPEG in primo luogo.


1
Grazie. E questo è vero anche quando si utilizza un programma "schifoso" come Paint, quando lo si salva ad es. In TIFF?
LBogaardt,

4
Almeno secondo il mio test rapido, Paint utilizza l' algoritmo di compressione LZW senza perdita di dati durante il salvataggio dei TIFF in modo che appaia OK.
Philip Kendall,

5
Tieni presente che è probabile che ciò aumenti in modo significativo le dimensioni dell'immagine ...
BlueRaja - Danny Pflughoeft

2
paint supporta anche PNG, che è anche un formato senza perdita di dati
phuclv

+1 per questo dato che le risposte che parlano del salvataggio su jpeg non sono compatibili con tutte le opzioni di codifica jpeg.
James Snell,

6

Non è abbastanza privo di perdite, ma puoi avvicinarti abbastanza usando GIMP (o qualche altro editor con una funzione simile) e i seguenti due trucchi:

  1. Innanzitutto, assicurati che il bordo che stai aggiungendo sia un multiplo di 8 pixel di larghezza (e preferibilmente un multiplo di 16 pixel).

    Questo è importante perché l'algoritmo di compressione JPEG suddivide l'immagine in blocchi di 8 × 8 pixel *, a partire dall'angolo in alto a sinistra, e applica l'algoritmo di compressione con perdita in modo indipendente a ciascun blocco. Pertanto, almeno in linea di principio, è possibile riempire senza perdita di immagine un'immagine JPEG aggiungendo blocchi di 8 × 8 pixel completi a quelli esistenti. Se, tuttavia, si provasse ad aggiungere un bordo che non era largo un intero numero di blocchi, i blocchi nell'immagine imbottita non si allineerebbero con quelli dell'originale e una perdita di compressione sarebbe inevitabile.

    *) In realtà, la maggior parte delle immagini JPEG usa il sottocampionamento Chroma , il che significa che solo la parte in scala di grigi dell'immagine è effettivamente compressa in blocchi 8 × 8, mentre i canali chroma sono ridimensionati del 50% prima della compressione, rendendo la loro dimensione effettiva del blocco 16 × 16 pixel. Pertanto, per risultati ottimali, la larghezza del bordo dovrebbe essere realmente un multiplo di 16 pixel. Tuttavia, di solito è possibile cavarsela con un bordo di 8 (o 24 o 40 ecc.) Pixel, poiché un po 'di perdita di compressione nel chroma non è molto evidente.

  2. La seconda parte del trucco è, quando si salva l'immagine finale, selezionare la casella di controllo "Usa impostazioni di qualità dall'immagine originale" nella finestra di dialogo Esporta immagine come JPEG (in Impostazioni avanzate). Fallo anche se sembra che si tradurrebbe in una qualità inferiore a quella che useresti normalmente!

    Questa impostazione consente a GIMP di riutilizzare esattamente le stesse impostazioni di compressione utilizzate per l'immagine originale, che di solito elimina circa il 99% delle perdite di compressione, a condizione che non sia stata modificata eccessivamente l'immagine e, in particolare, che i blocchi nella la nuova immagine si allinea ancora con quella dell'originale. (Occasionalmente ci saranno ancora delle perdite dovute a errori di arrotondamento, ma molto meno di quanto sarebbe altrimenti.)


Come dimostrazione rapida, ho preso questa immagine di prova JPEG da Wikimedia Commons , originariamente salvata con un'impostazione di qualità abbastanza bassa di 50, e ho aggiunto un elegante bordo (bianco e nero) 8px usando il metodo sopra descritto:

Immagine di prova con bordo 8px, per lo più senza perdita

Ecco la differenza tra l'originale (15.1 kB) e l'immagine modificata (16.7 kB), mostrata usando la modalità di livello "Estrazione del grano" di GIMP:

Differenza tra immagine imbottita e originale

Si possono vedere alcuni lievi errori di crominanza, causati dalla larghezza del bordo che non è un multiplo di 16 e (se si guarda da vicino) alcuni blocchi in cui si sono verificate anche piccole perdite nel canale di luminanza a causa del arrotondamento. Tuttavia, visivamente, l'immagine originale e quella imbottita sono quasi indistinguibili, anche con ingrandimento 2x e alternando alternativamente.

In particolare, contrastare questo con il risultato di aumentare la qualità JPEG da 50 a 60 prima di salvare l'immagine imbottita, che produce la seguente immagine da 17,6 kB:

Immagine di prova con bordo 8px, qualità aumentata da 50 a 60

Ad alto ingrandimento, puoi sicuramente vedere che l'immagine modificata è notevolmente più sfocata in alcuni punti rispetto all'originale, e prendendo la differenza con l'estratto di grano lo conferma:

Differenza tra immagine imbottita (a q60) e originale


"la selezione di questa casella di controllo non sembra influire sull'impostazione" Progressivo "." Non un bug, poiché la codifica progressiva è un'impostazione di codifica, non un'impostazione di qualità. Jpegtran può convertire immagini da e verso progressivamente senza perdita di dati.
Damian Yerrick,

@tepples: hai ragione; Ho rimosso quel paragrafo. Per qualche motivo, ho avuto l'impressione che l'attivazione / disattivazione della modalità progressiva avrebbe impedito alle impostazioni di qualità di adattarsi, ma un test rapido sembra confermare che mi sbagliavo.
Ilmari Karonen,

1
@thomasrutter: non posso sottovalutare un commento, quindi ti indicherò il post sul forum originale che descrive la funzione , e in particolare questa citazione: " Se hai apportato solo alcune modifiche all'immagine, allora ri l'uso delle stesse tabelle di quantizzazione ti darà quasi la stessa qualità e dimensione del file dell'immagine originale. Ciò minimizzerà le perdite causate dal passaggio di quantizzazione, rispetto a ciò che accadrebbe se tu
usassi

1
Solo per confronto, ecco un altro esempio in una risposta a una domanda diversa. La mia comprensione in teoria concorda con Ilmari ma almeno nel mio esempio la pratica sembra essere molto più con ciò che dice Thomas - almeno quando si inizia con un'immagine altamente degradata. (Penso che la lapide sia un cattivo esempio per questo scopo, perché la perdita di dettagli sulla pietra è meno evidente di quanto non lo siano sulla pelle umana.)
mattdm

1
@mattdm: sembra essere abbastanza dipendente dal software; Ho provato a riprodurre i tuoi risultati da quella risposta in GIMP, e sembra che GIMP (almeno v2.8.10) sia un po 'più bravo a preservare la qualità JPEG di ImageMagick (qualunque versione tu abbia provato). La tua prima immagine, salvata una volta al q75, ha un PSNR di 34.0298, mentre quella salvata due volte al q75 ha uno di soli 32.8169 (e quella salvata 8 volte ha un PSNR di 32.6459). In confronto, salvando la stessa immagine sorgente una volta in GIMP a q75 si ottiene un PSNR di 36.4560; aprendolo e salvandolo con la stessa qualità lo rilascia solo leggermente, a 36.3295.
Ilmari Karonen,

3

Scusa se questo non è esattamente quello che volevi ma ...

Sembra che l'aggiunta di un bordo bianco sia un aiuto per posizionare l'immagine durante la stampa. Perché non concentrarsi sull'apprendimento delle interfacce di stampa in modo corretto ed evitare hack ingannevoli come questo? L'altro problema che si pone è che si consente al programma di stampa di ridimensionare l'immagine 4680x3120 per adattarsi al DPI / risoluzione corretti. Ciò potrebbe avere un effetto più grave rispetto al salvataggio di un jpeg.


Entrambi i punti validi, grazie. Tuttavia, ho caricato la mia foto in una di quelle tipografie online, quindi non ho il controllo della stampante reale.
LBogaardt,

1

Le risposte precedenti sono molto buone.

Aggiungerò solo alcuni "aspetti psicologici" del formato jpg.

Se un jpg è ben preparato, perde solo circa lo 0,5% delle informazioni. Questo è nella stragrande maggioranza dei casi qualcosa che l'occhio umano non può vedere. Hai bisogno di un programma per fare alcune analisi e vedere le differenze (come l'analisi appena fatta da Ilmari).

La "buona qualità" è un processo, non solo il modo in cui un formato di file salva l'immagine. Sì, hai ricompresso il file con jpg ancora una volta perché ne avevi davvero bisogno. Se è in una situazione controllata, va bene farlo.

Ne avevi davvero bisogno implica che non puoi utilizzare un altro formato lossless, hai esigenze di archiviazione o software molto specifiche o un flusso di lavoro molto stretto.

Se sei davvero preoccupato per la qualità, probabilmente non utilizzeresti Paint. Il formato JPG ha alcune configurazioni che non puoi assolutamente controllare in Paint.

Ecco il mio elenco di programmi gratuiti in cui puoi davvero controllare la compressione jpg e l'opzione che devi selezionare. (Tutti nella finestra di dialogo di salvataggio jpg)

Irfanview - Attiva Disabilita il sottocampionamento cromatico.

FastStone Image Viewer - Sottocampionamento colore: Nessuno.

Gimp - Sottocampionamento 4: 4: 4

Conclusione. Non usare Paint.

Una cosa che non ho ancora verificato. Se tutti questi programmi mantengono il profilo colore incorporato. Modificherò il mio post più tardi.


Qualcuno ha votato -1 su questa risposta. Normalmente non mi interessa perché so di poter dire qualcosa di stupido. In questo caso specifico, quale parte della risposta è sbagliata?
Rafael,

Non ho votato (su o giù), ma potresti voler lavorare sulla tua ortografia e grammatica per dare una prima impressione migliore (e anche, onestamente, per rendere la tua risposta più facile da leggere). Inoltre, questa domanda ha già diverse risposte (e la mia, in particolare, si è rivelata piuttosto lunga); ad un certo punto, alcune persone potrebbero iniziare a votare (o almeno non a votare) le risposte che non aggiungono chiaramente qualcosa di nuovo a quelle esistenti. Inoltre, prova a strutturare la tua risposta in modo che i bit importanti si distinguano a colpo d'occhio; in questo caso, l'unica parte che hai evidenziato in grassetto è una nota non importante.
Ilmari Karonen,

Grazie per il tuo commento Ilmari. Sto lottando per pensare in inglese, poiché non è la mia lingua madre. Cercherò uno strumento di ortografia. Non sono sicuro che ce ne sia uno grammaticale. - Per la seconda parte del commento, capisco che la logica alla base di StackExchange è quella di rispondere alla domanda in modo indipendente, perché il flusso delle risposte non è fisso, perché possono cambiare ordine o essere modificati. Ci darò un'occhiata. (Ho rimosso il testo in grassetto) Grazie ancora. : o)
Rafael,

1
"perde solo circa lo 0,5% delle informazioni" [citazione necessaria] :)
Warren Young

Ehi Warren, eccolo qui: otake.com.mx/Apuntes/PruebasDeCompresion2/… È in spagnolo, per favore usa google translate per ora, e devo aggiornarlo. In realtà è inferiore allo 0,392% :)
Rafael,

0

IrfanView funziona bene per me per set di immagini. Ecco alcune note pratiche

Ecco la mia procedura memorizzata per l'inserimento del bordo - Procedura Infran per aggiungere un bordo

  1. Immagine del tasto destro del mouse, 'Apri con' -> 'InfranView'
  2. Premi 'b'
  3. Seleziona "Usa opzioni avanzate" in alto a sinistra, premi "Avanzate"
  4. Seleziona 'Dimensione tela', premi 'Impostazioni'
  5. Inserisci ogni larghezza del bordo (lato sinistro, lato destro, lato superiore, lato inferiore)
  6. Premere OK'
  7. Seleziona "Sovrascrivi file esistenti"
  8. Premere OK'
  9. Immettere la directory di output "Directory di output per i file dei risultati:"
  10. Passare a e fare doppio clic sull'immagine per aggiungere il bordo nell'elenco superiore. Questo lo aggiunge all'elenco "file di input:" nell'elenco in basso
  11. Premi "Avvia batch"

1
Potresti spiegare cosa c'è di speciale in quel metodo in modo che soddisfi i requisiti del poster di non ridurre la qualità dell'immagine? In prima lettura, questo sembrerebbe inviare il JPEG attraverso l'intero ciclo di decompressione-ricompressione che il poster sta cercando di evitare.
Philip Kendall,

hmmm, hai portato un punto interessante rispetto al ciclo di vita dell'immagine attraverso il processo che elencherò qui, non ci ho pensato. Potresti avere ragione, se desideri che rimuova o modifichi la mia pubblicazione, per favore fatemelo sapere :)!
J-Dizzle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.