Domanda

Il titolo dice abbastanza credo. Ho un BufferedImage qualità totale e voglio inviarlo tramite un OutputStream con un basso Profondità di colore. Non voglio un algoritmo di cambiare pixel per pixel la qualità, quindi è ancora una piena qualità.

Quindi, l'obiettivo è quello di scrivere l'immagine (con la piena risoluzione, full size) attraverso l'OuputStream che prende un poco numero di byte da scrivere.

Grazie,
Martijn

È stato utile?

Soluzione

È necessario codificare i dati immagine nel formato che ha le caratteristiche giuste per la vostra immagine. Se si tratta di colore a 24 bit e ha un sacco di colori e si vuole perdere nessuna qualità, si sono probabilmente bloccati con PNG, ma guarda in lossless JPEG 2000.

Se si può perdere un po 'di qualità, quindi provare

  1. lossy JPEG 2000 - molto più piccolo rispetto al formato JPEG per la stessa perdita di qualità
  2. ridurre il numero di colori e con modalità mappata colore

Se l'immagine ha solo i dati di grigio o bianco e nero, fare in modo che si codifica come tale (8-bit grigio o 1 bit bianco e nero). Quindi, assicurarsi di utilizzare un encoder che è sintonizzato per quel tipo di formato (ad esempio TIFF con Gruppo 4 o JBIG2).

Un'altra buona opzione è quella di rimuovere tutti i meta-dati di escludere dalla scansione (o assicurarsi che il codificatore non mette alcuna in).

Se si vuole attaccare con ciò che è in Java, probabilmente dovete usare TIFF, PNG o JPEG - ci sono endcoders immagine di terze parti (ad esempio, la mia azienda, Atalasoft , fa una versione di .NET di questi encoder avanzati - ci sono venditori Java là fuori pure)

A proposito: la riduzione profondità di bit di solito significa ridurre la qualità (a meno che la riduzione non ha senso). Per esempio se ho un immagine a colori a 24 bit, ma tutti i colori sono il grigio (in cui R == G == B), quindi ridurre a 8-bit grigio non perde di qualità. Questo è vero anche se l'immagine ha qualsiasi raccolta di 256 colori diversi e si passa a un formato (indicizzato o tavolozza) di colore mappato. Si riduce il numero di byte e non riducono la qualità.

Altri suggerimenti

Dai un'occhiata al pacchetto java.util.zip per tutti sulla compressione:

http://java.sun.com/developer/technicalArticles/Programming/ compressione /

Anche se JPEG e PNG sono già in qualche modo compressi, utilizzando la classe Inflater, è possibile ridurre il numero di byte, pur mantenendo la stessa identica qualità dell'immagine. Compressione di un formato già compresso in genere non sono significativi. Se si raggruppano diverse immagini insieme, però, li gonfiare è significativa (dal momento che le tecniche di inflazione riconoscono modelli comuni in dati degli oggetti, che riducono la ripetizione e riduce quindi numero di byte).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top