2015-09-05 15 views
5

La classe Java BufferedImage ha un lungo elenco di variabili di classe noto come tipo di immagine che può essere utilizzato come argomento per il costruttore BufferedImage.Come decidere quale tipo di immagine BufferedImage usare?

Tuttavia, i documenti Java hanno fornito una spiegazione minima su cosa questi tipi di immagini sono utilizzati e su come influenzerebbe la creazione di BufferedImage.

La mia domanda è:

  1. Come sarebbe un tipo di immagine influenzare la BufferedImage da creare? Controlla il numero di bit usati per memorizzare vari colori (rosso, verde, blu) e la sua trasparenza?

  2. Quale tipo di immagine che dovremmo usare se vogliamo solo creare

    • un'immagine opaca
    • un'immagine trasparente
    • un'immagine traslucida

Ho letto la descrizione nel documento Java molte volte, ma proprio non riuscivo a capire come dovremmo usarlo. Ad esempio, questo:

TYPE_INT_BGR

rappresenta un'immagine con componenti di colore RGB a 8 bit, corrispondente ad un Windows o stile Solaris- modello di colore BGR, con i colori blu, verdi, e rosso impacchettato in pixel interi. Non c'è alfa. L'immagine ha un DirectColorModel. Quando i dati con alfa non opaco sono memorizzati in un'immagine di questo tipo, i dati del colore devono essere adattati a un modulo non premoltiplicato e l'alfa scartato, come descritto nella documentazione di AlphaComposite.

+0

Cos'è un'immagine traslucida? In che modo è diverso da un'immagine trasparente? –

+0

@AndyTurner Ricordo che l'ho letto da qualche parte sul rendere trasparenti parti dell'immagine mentre è traslucido sulla regolazione dell'opacità dell'intera immagine. Ad esempio, un file gif consente la trasparenza ma non la traslucenza, mentre i file png supportano entrambi. Questo è un esempio in cui potrebbe essere necessario utilizzare un diverso tipo di immagine. No? – user3437460

risposta

6

A meno che non si dispone di requisiti specifici (ad esempio il salvataggio della memoria o il salvataggio di calcoli o un formato specifico di pixel nativo) basta andare con il default TYPE_INT_ARGB che ha 8 bit per canale, 3 canali + alfa.

Saltare il canale alfa quando si lavora con 8 bit per canale non influirà sulla memoria totale occupata dall'immagine poiché ogni pixel verrà imballato in un int in ogni caso, quindi 8 bit verranno scartati.

Fondamentalmente si ha:

  • TYPE_INT_ARGB, 4 byte per pixel con canale alfa
  • TYPE_INT_ARGB_PRE, 4 byte per pixel, come prima, ma colori sono già moltiplicate per l'alfa del pixel per salvare calcoli
  • TYPE_INT_RGB, 4 byte per pixel senza canale alfa
  • TYPE_USHORT_555_RGB e TYPE_USHORT_565_RGB, 2 byte per pixel, tanto meno colori, non c'è bisogno di usare unl ess hai vincoli di memoria

Poi ci sono tutti lo stesso tipo di formati con canali scambiati (es. BGR invece che RGB). Dovresti scegliere quello nativo della tua piattaforma in modo che sia necessario effettuare meno conversioni.

+0

grazie per la tua risposta veloce. Quindi posso usare 'TYPE_InT_ARGB' per un'immagine opaca, trasparente e traslucida a meno che non abbia qualche altro bisogno speciale come menzionato da te? – user3437460

+0

Sì, un'immagine traslucida non è traslucida di per sé (a meno che tutti i pixel non abbiano alfa). È possibile ottenere la traslucenza disegnando l'immagine con fusione alfa sul framebuffer di destinazione. – Jack

+0

E così a lungo il tipo di immagine ha il supporto per il canale alfa, sarà in grado di supportare la trasparenza. Ho ragione di dirlo? Questa è la mia ultima domanda! : D – user3437460

Problemi correlati