5 votes

Recadrage d'un bitmap sans lecture préalable de l'ensemble du bitmap

J'ai une très grande image et je veux seulement afficher une section de la taille de l'affichage (pas de mise à l'échelle), et la section devrait juste être le centre de l'image. Comme l'image est très grande, je ne peux pas lire toute l'image en mémoire et ensuite la recadrer. C'est ce que j'ai fait jusqu'à présent mais cela donnera OutOfMemory pour les grandes images. De plus, je ne pense pas que l'option inSampleSize s'applique car je veux recadrer l'image, et non réduire sa résolution.

Uri data = getIntent().getData();
InputStream is = getContentResolver().openInputStream(data);
Bitmap bitmap = BitmapFactory.decodeStream(is, null, null);

Toute aide serait la bienvenue.

2voto

android developer Points 20939

Vous pouvez le faire en 2 étapes :

  1. obtenir la taille du bitmap, en utilisant inJustDecodeBounds=true .

  2. utiliser BitmapRegionDecoder pour décoder uniquement la partie que vous voulez .

L'inconvénient ? il ne fonctionne qu'à partir de l'API 10 (mais c'est déjà la majorité...).

1voto

bpescatore Points 163

Je suis d'accord pour dire que le plus simple est de décomposer l'image en de nombreuses petites images en mosaïque et de charger celles qui conviennent pour obtenir l'image souhaitée.

Cependant, si vous ne voulez pas faire cela, vous serez peut-être obligé d'examiner l'encodage du jpeg lui-même.

Ce que vous pourriez faire, c'est copier l'en-tête du fichier dans un nouveau fichier, puis extraire uniquement les pixels que vous voulez afin de créer un nouveau fichier. En rechargeant le nouveau fichier, vous n'aurez que le sous-ensemble de l'image avec lequel vous souhaitez travailler, et toutes les fonctionnalités et classes Java habituelles seront également disponibles.

Je sais que ce n'est pas nécessairement une solution élégante ou simple, mais elle garantit que vous pourrez utiliser la fonctionnalité java originale que vous vous attendez à pouvoir utiliser.

0voto

j flemm Points 939

Je pense que vous abordez le problème dans la mauvaise direction.

Si le bitmap est déjà si grand qu'il ne peut être chargé comme une seule image continue, pourquoi le stocker comme une seule image ? Découpez-la en tuiles, puis chargez la ou les tuiles centrales et agissez sur celles-ci.

0voto

Roy Samuel Points 606

@bpescatore, Comment dois-je procéder pour supprimer l'en-tête du fichier image (données matricielles) ? Comment faire de même pour les différents formats d'images, comme jpeg, bmp, png etc ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X