Y a-t-il une bibliothèque Java qui peut lire des régions de fichiers d'images très volumineuses (E.G. JPEG) (> 10 000 x 10 000 pixels) sans tenir l'image en mémoire. P>
ou alternativement, quelle bibliothèque Java est capable de gérer de très grands fichiers d'image avec un minimum de frais généraux. P>
3 Réponses :
Vous pouvez utiliser, par exemple, randomAccessfile à lire à partir du milieu du fichier: Mais le problème est que toute l'image JPEG est compressée après la quantification DCT ( http: //www.fileformat .info / miroir / EGFF / CH09_06.htm ), donc je ne pense pas qu'il soit possible de lire un fragment sans lire un fichier entier à la mémoire. P>
Je n'ai que la connaissance superficielle de la quantification JPEG et DCT, mais je pense que DCT est appliqué à des blocs de pixels de 8x8 et il devrait être possible d'éviter de décoder tous les blocs afin d'obtenir une région. Bien sûr, il est nécessaire d'obtenir des coefficients / informations d'autres parties de l'image, mais cela ne signifie pas que je dois lire toutes les données en mémoire ... mais je pourrais avoir tort.
Vous pouvez utiliser un bufferedimage code> pour faire ce dont vous avez besoin.
// Set these variables according to your requirements
int regionX, regionY, regionWidth, regionHeight;
BufferedImage image = ImageIO.read(new File("/path/to/image.jpg"));
BufferedImage region = image.getSubimage(regionX, regionY, regionWidth, regionHeight);
@Raman: Vous décrivez l'approche standard qui fonctionne bien avec des images modérément dimensionnées. Vous lisez l'image totale i> dans une mémoire tampon, puis extrayez la région. Mon problème est que cela nécessite beaucoup de mémoire avec de très grandes images, car tous les pixels sont décodés et tenus en mémoire. Pour une image de taille 20 000x30 000, cela nécessiterait près de 2 Go de mémoire; De plus, le décodeur passe du temps à décoder des pixels qui ne sont jamais utilisés ...
Standard imageIO vous permet de lire des régions d'images (grandes) sans lire l'ensemble de l'image dans la mémoire.
Salut! Merci pour ce très bon code coupé. Est-il réellement possible d'écrire une région à une image sans lire l'image entière? Ma région n'est que 100px de la place et j'aime la stocker à un endroit donné dans un énorme JPEG.
@Durin Oui, il pourrait être possible dans certains formats de fichiers. L'API ImageOIO le supporte. Mais s'il vous plaît poser une nouvelle question! :-)
Voulez-vous lire une région en termes de décalage d'octets et de longueur ou quelques pixels de toute l'image?
Une région en termes de pixels.
D'accord, essayez la réponse que j'ai postée ci-dessous.