2011-12-02 9 views

risposta

12

È possibile determinare il numero di byte dei dati di immagine da solo occupa di utilizzare questo:

DataBuffer buff = image.getRaster().getDataBuffer(); 
int bytes = buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType())/8; 

L'immagine si prende un po 'più spazio per il modello di colore e altre informazioni di contabilità, ma per immagini di grandi dimensioni, bytes sarà il termine dominante.

+0

+1 decisamente un approccio intelligente. L'overhead aggiuntivo in una BufferedImage è relativamente piccolo, soprattutto perché la maggior parte delle immagini al giorno d'oggi non usa un modello di colore indicizzato (che è l'unico altro potenziale pezzo di dati in un'immagine, potrebbe essere fino a 256k in casi rari). – mikera

+0

Perché dividi per 8 alla fine. GetDataType() restituisce la dimensione in bit? – klyngbaek

+0

@ thehanseatic - Esattamente. Dai documenti per [DataBuffer] (http://docs.oracle.com/javase/6/docs/api/java/awt/image/DataBuffer.html): _ "Restituisce la dimensione (in bit) del tipo di dati , dato un tag datatype. "_ –

0

Non sono sicuro che esista un modo semplice per capirlo con una precisione del 100% fino al numero di byte, senza calcolarlo da soli (tenendo conto del modello di colore, della dimensione dell'immagine e di altri fattori).

You can calculate the totalMemory() and freeMemory() sullo heap prima e dopo l'allocazione e ottenere una stima in questo modo. Se altri oggetti sono assegnati (o raccolti) tra i tuoi assegni, il tuo calcolo non sarà accurato.

This discussion parla della dimensione dei tipi primitivi nella JVM (un oggetto è una raccolta di molti oggetti primitivi), che è possibile utilizzare per capirlo.

This article fornire una panoramica dell'utilizzo della memoria in Java.

+0

Come farei a calcolarlo da solo (l'uso di mem del modello di colore e altri fattori?) Grazie. – klyngbaek

+0

Mi riferivo al modo manuale di calcolare questo, leggendo la documentazione, cercando di capire quali sono i primitivi che alla fine hanno composto una determinata immagine, e quindi solo sommando i valori. – jefflunt

0

Utilizzare Runtime#totalMemory e Runtime#gc dovrebbe essere in grado di ottenere un'approssimazione molto vicino. Esempio:

Runtime.getRuntime().gc();Runtime.getRuntime().gc();Runtime.getRuntime().gc(); 
long totalUsed = Runtime.getRuntime().totalMemory(); 

BufferedImage image = ... 

Runtime.getRuntime().gc();Runtime.getRuntime().gc();Runtime.getRuntime().gc(); 
totalUsed = Runtime.getRuntime().totalMemory() - total; 

Calling gc più volte aumenta la possibilità che il garbage collector verrà effettivamente eseguito, in quanto gc è solo un suggerimento. Chiamando gc in questo esempio si garantisce che nessun oggetto che sarebbe stato raccolto si aggiunga all'utilizzo della memoria.

Problemi correlati