web-dev-qa-db-fra.com

Empêcher le bitmap trop grand pour être téléchargé dans une texture android

J'ai besoin d'afficher l'image originale en plein écran sous forme de galerie. Pour le pouce, cela fonctionnera parfaitement et lorsque j'essaierai d'afficher cette image en plein écran avec la source d'origine, elle ne pourra pas s'afficher. Dans la plupart des cas, si la résolution de l'image est supérieure à 2000, elle affichera une erreur bitmap trop grand pour être téléchargé dans une texture Android.

Je veux empêcher cela, j'ai une recherche google mais je n'ai pas de réponse à ce sujet.

15
Pratik

Je suis tombé sur le même problème et j'ai trouvé une solution à un revêtement pour ce problème ici :

Picasso.with(context).load(new File(path/to/File)).fit().centerCrop().into(imageView);
17
Phileo99

je viens de créer une fonction if else pour vérifier si l'image est plus grande que 1M pixels voici l'exemple de code:

public void onActivityResult(int requestCode, int resultCode, Intent data) {

   if (resultCode == RESULT_OK) {

     if (requestCode == SELECT_PICTURE) {

        Uri selectedImageUri = data.getData();
        selectedImagePath = getPath(selectedImageUri);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 4;

        Bitmap bitmap = BitmapFactory.decodeFile(selectedImagePath);
        int height = bitmap.getHeight(), width = bitmap.getWidth();

        if (height > 1280 && width > 960){
            Bitmap imgbitmap = BitmapFactory.decodeFile(selectedImagePath, options);
            imageView.setImageBitmap(imgbitmap);

            System.out.println("Need to resize");

        }else {
            imageView.setImageBitmap(bitmap);
            System.out.println("WORKS");
        }
8
Gilbert92

Google a fourni une formation sur la façon de procéder. Téléchargez l'exemple de Affichage efficace des bitmaps

Jetez un œil à la classe ImageResizer. ImageResizer.decodeSampledBitmapFrom * utilisez cette méthode pour obtenir une image réduite.

4
Minas

C'est le code que j'ai utilisé pour corriger mon problème d'ajustement d'une image de résolution 3120x4196 dans une vue d'image de résolution 4096x4096. Ici ImageViewId est l'id de la vue d'image créée dans la mise en page principale et ImageFileLocation est le chemin de l'image à redimensionner.

        ImageView imageView=(ImageView)findViewById(R.id.ImageViewId);          
        Bitmap d=BitmapFactory.decodeFile(ImageFileLcation);
        int newHeight = (int) ( d.getHeight() * (512.0 / d.getWidth()) );
        Bitmap putImage = Bitmap.createScaledBitmap(d, 512, newHeight, true);
        imageView.setImageBitmap(putImage);
3
Kartik Nigam

Vous n'avez pas besoin de charger l'image entière, car elle est trop grande et votre téléphone ne sera probablement pas en mesure d'afficher les pixels bitmap complets. Vous devez d'abord le mettre à l'échelle en fonction de la taille de l'écran de votre appareil. C'est la meilleure méthode que j'ai trouvée et elle fonctionne plutôt bien: Android: redimensionner un gros fichier bitmap en fichier de sortie mis à l'échelle

1
shem

J'ai trouvé un moyen de le faire sans utiliser de bibliothèques externes :

if (bitmap.getHeight() > GL10.GL_MAX_TEXTURE_SIZE) {

    // this is the case when the bitmap fails to load
    float aspect_ratio = ((float)bitmap.getHeight())/((float)bitmap.getWidth());
    Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                    (int) ((GL10.GL_MAX_TEXTURE_SIZE*0.9)*aspect_ratio),
                    (int) (GL10.GL_MAX_TEXTURE_SIZE*0.9));
    imageView.setImageBitmap(scaledBitmap);
}
else{

    // for bitmaps with dimensions that lie within the limits, load the image normally
    if (Build.VERSION.SDK_INT >= 16) {
        BitmapDrawable ob = new BitmapDrawable(getResources(), bitmap);
        imageView.setBackground(ob);
    } else {
        imageView.setImageBitmap(bitmap);
    }
}

Fondamentalement, les dimensions maximales de l'image sont une limite imposée par le système. L'approche ci-dessus redimensionnera correctement les bitmaps qui dépassent cette limite. Cependant, seule une partie de l'image entière sera chargée. Pour modifier la région affichée, vous pouvez modifier les paramètres x et y de la méthode createBitmap().

Cette approche gère les bitmaps de toutes tailles, y compris les photos prises avec des appareils photo professionnels.

Références:

Android Universal Image Loader .

1
Y.S