2010-08-05 6 views
7

mio programma produce 10 x 10 piastrelle immagini di 3000x3000 pixel, uno per uno (attualmente salvato a 100 file denominati image_x_y.jpg)Come creare un grande file immagine da molte tessere in java?

voglio montare questi 100 immagini in un'unica grande immagine, senza caricare tutto in memoria. Il mio obiettivo è creare un unico file immagine di 30'000 * 30'000 pixel.

Sto cercando un modo per farlo senza utilizzare JAI (che non può essere installato dai repository Maven pubblici, non capisco perché)

c'è un modo per fare questo con puro Java2D ? O esiste un'altra libreria, in grado di gestirlo?

La mia idea originale era di creare un'immagine buffer molto grande, da un DataBuffer su un file sul disco. Ma non sono sicuro che sia possibile. Qualcuno lo ha mai fatto?

risposta

6

Voglio assemblare queste 100 immagini in un'unica grande immagine, senza caricare tutto in memoria. Il mio obiettivo è creare un unico file immagine di 30'000 * 30'000 pixel.

Credo che in JAI ci sia una classe che fa questo. Qualunque problema tu abbia nell'integrare JAI nel tuo progetto, persevererei con esso piuttosto che pubblicare la tua versione. Non c'è nulla di simile in Java2D.

La mia idea originale era quella di creare un'immagine buffer molto grande, da un DataBuffer di backup a un file sul disco. Ma non sono sicuro che sia possibile. Qualcuno lo ha mai fatto?

Sì, ho scritto un'implementazione incompleta di questo. È costituita da

  • Un DataBuffer che è sostenuta da un ByteBuffer invece che una matrice (se il buffer è diretto può essere associato a un file.)
  • Un WritableRaster simile alle raster standard, ma utilizzando la mia implementazione di DataBuffer (raster standard nel trucco JDK di possesso di un riferimento alla matrice di supporto. non v'è alcuna matrice nel caso di una diretta ByteBuffer così purtroppo è necessario re-implementare la maggior parte Raster metodi.)

faccio non consigliare l'estensione SampleModel perché la tua classe non funzionerà con i raster JDK (vari metodi in Java2D compresi i metodi di fabbrica Raster attivano il tipo di SampleModel assumendo che sia uno di quelli standard. Cattivo design IMHO ma non puoi farci molto altro che seguire lo stesso schema.)

+0

OK, sembra che usare JAI sia la soluzione più intelligente. Continuerò in questo modo e non gestirò personalmente le immagini. –

+1

Alcuni ulteriori dettagli su come implementare questo sarebbe il benvenuto –

1

Non so se è possibile senza caricare tutto in memoria. Puoi scaricare tutte le tue immagini su un bmp non compresso, e quindi utilizzare qualche strumento esterno per convertirlo in jpg.

+0

Un file non compresso sarà ENORME. Circa 30 MB per tile a 24 bit per pixel. (vedi http://en.wikipedia.org/wiki/BMP_file_format). Penso davvero che pagherebbe per guardare a diverse implementazioni. – extraneon

1

Se hai problemi ad usare una risorsa da un repository pubblico di Maven potresti voler usare Nexus, un proxy Maven e aggiungere manualmente la JAI jar lì (e aggiungilo alla tua lista di repository).

Il vantaggio di scegliendo questa soluzione è che si avrebbe JAI, e avrebbe un modo standard per utilizzare le risorse non Maven (tutte le librerie javax) in modo Maven.

Non giocherellare con questo intorno a te, la materia di imaging è complessa a causa di tutta la compressione coinvolta e occuparsi di BMP sul disco è, date le dimensioni dell'immagine (circa 100 * 30 MB = 3 GB) probabilmente non ottimale né veloce.

1

La soluzione è BigBufferedImage. Può caricare e memorizzare immagini molto più grandi del limite di memoria. Il trucco è che il suo buffer viene sostituito con un'implementazione basata su file di DataBuffer. Memorizza i dati di immagine grezza decodificati nei file. Non viene utilizzata RAM. Questo può prevenire OutOfMemoryException.

Per ulteriori informazioni sulla gestione delle immagini grandi read this article.

Problemi correlati