Autore Topic: Bitmap too large to be uploaded into a texture  (Letto 1662 volte)

Offline Tizionario

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Github
    • Google+
    • tizionario
    • tizionario
    • Mostra profilo
    • Svappdroid
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Tizionario
  • Sistema operativo:
    ArchLinux
Bitmap too large to be uploaded into a texture
« il: 28 Ottobre 2013, 19:53:40 CET »
0
Salve a tutti,

mi pare di non aver visto nulla del genere sul forum (in caso contrario chiedo scusa per il post duplicato); dunque, sto cercando di capirci qualcosa per quanto riguarda la manipolazione delle immagini e dopo aver letto i tutorial sul sito ufficiale Android Developers ho cercato di creare un'Activity in grado di prendere un'immagine dalla galleria e di mostrarla in un ImageView.

Ho un problema con le immagini grandi scattate con una camera da 12Mpx, ma anche con quelle da 5Mpx del mio galaxy nexus: in pratica l'ImageView non mostra l'immagine caricata e il Logcat mi restituisce il warning "Bitmap too large to be uploaded into a texture (max 2048x2048)".
La cosa strana è che lo stesso warning non appare su un Galaxy Nexus emulato.

Premesso che eseguo già il resampling dell'immagine caricata, ecco qui il codice dell'Activity:
Codice (Java): [Seleziona]
package com.example.bitmapdemo;

import java.io.FileNotFoundException;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity {
        public ImageView canvasImageView;
        public Button selectImageButton;
        public LinearLayout ll;
        public Bitmap image;
       
        //REQUEST CODE
        public static final int SELECT_IMAGE_REQ_CODE = 1;
       
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ll = (LinearLayout) this.findViewById(R.id.LinearLayout1);
        canvasImageView = (ImageView) this.findViewById(R.id.canvasImageView);
        selectImageButton = (Button) this.findViewById(R.id.selectImageButton);
       
        selectImageButton.setOnClickListener(new OnClickListener(){
               
                @Override
                public void onClick(View v)
                {
                        Intent selectImageIntent = new Intent(Intent.ACTION_GET_CONTENT);
                        selectImageIntent.setType("image/*");
                        startActivityForResult(selectImageIntent, SELECT_IMAGE_REQ_CODE);
                }
        });
    }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if(requestCode == SELECT_IMAGE_REQ_CODE)
                {
                        switch(resultCode)
                        {
                                case(RESULT_OK):
                                        Uri imageUri = data.getData();

                                        try
                                        {
                                                int inSampleSize = calculateInSampleSize(imageUri);
                                                image = resampleImage(imageUri, inSampleSize);
                                                canvasImageView.setImageBitmap(image);
                                        }
                                        catch(FileNotFoundException e){}
                        }
                }
        }
       
        public int calculateInSampleSize(Uri imageUri) throws FileNotFoundException
        {
                BitmapFactory.Options opts = new BitmapFactory.Options();
                opts.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri), null, opts);
                int imageWidth = opts.outWidth;
                int imageHeight = opts.outHeight;
                int inSampleSize = 1;
               
                //Get display dimension in order to calculate image ratio
                DisplayMetrics displayMetrics = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
               
                int reqWidth = displayMetrics.widthPixels;
                int reqHeight = displayMetrics.heightPixels;
                if(imageHeight > reqHeight || imageWidth > reqWidth)
                {
                        final int heightRatio = Math.round((float)imageHeight / (float) reqHeight);
                        final int widthRatio = Math.round((float) imageWidth / (float) reqWidth);
                       
                        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
                }
                Toast.makeText(getApplicationContext(), "inSampleSize = " + Integer.toString(inSampleSize), Toast.LENGTH_LONG).show();
                return inSampleSize;
               
        }
       
        public Bitmap resampleImage(Uri imageUri, int inSampleSize) throws FileNotFoundException
        {
                BitmapFactory.Options opts = new BitmapFactory.Options();
                opts.inJustDecodeBounds = false;
                opts.inSampleSize = inSampleSize;
                Bitmap btm = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                opts.outHeight = btm.getHeight();
                opts.outWidth = btm.getWidth();
                //return BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri), null, opts);
                return Bitmap.createScaledBitmap(btm, opts.outWidth, opts.outHeight, false);
        }    
}

ed anche il codice del layout:
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/LinearLayout1"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".MainActivity" >

    <ImageView
       android:id="@+id/canvasImageView"
       android:layout_width="wrap_content"
       android:layout_height="0dp"
       android:layout_weight="1"
       android:layout_gravity="center"
       android:src="@drawable/ic_launcher" />

    <Button
       android:id="@+id/selectImageButton"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="@string/select_image_button" />

</LinearLayout>

Grazie a tutti quanti risponderanno al topic  ;-)
Vuoi diventare uno sviluppatore Android? Segui i miei tutorial su http://svappdroid.com

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Bitmap too large to be uploaded into a texture
« Risposta #1 il: 28 Ottobre 2013, 20:27:58 CET »
0
Dipende dalla GPU presente del SoC usato dal telefonino, ormai la grafica viene gestita via OpenGL-ES, le immagini sono caricate come texture e quella immagine supera i limiti hardware. Nel emulatore la GPU non viene emulata (bisogna abilitare esplicitamente il supporto hardware della scheda video del PC, se è compatibile) quindi non compare il messaggio.
adb logcat | tee /tmp/logcat | grep TAG

Offline Tizionario

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Github
    • Google+
    • tizionario
    • tizionario
    • Mostra profilo
    • Svappdroid
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Tizionario
  • Sistema operativo:
    ArchLinux
Re:Bitmap too large to be uploaded into a texture
« Risposta #2 il: 28 Ottobre 2013, 20:47:05 CET »
0
E come risolvere sul vero dispositivo?
Ho letto in giro che è possibile disabilitare l'accelerazione hardware dal manifest ma mi sembra un modo abbastanza grezzo per risolvere la cosa
Vuoi diventare uno sviluppatore Android? Segui i miei tutorial su http://svappdroid.com

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Bitmap too large to be uploaded into a texture
« Risposta #3 il: 28 Ottobre 2013, 22:59:02 CET »
0
Evita di visualizzare immagini con dimensioni maggiori dei limiti della GPU in uso.
adb logcat | tee /tmp/logcat | grep TAG

Offline Tizionario

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Github
    • Google+
    • tizionario
    • tizionario
    • Mostra profilo
    • Svappdroid
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Tizionario
  • Sistema operativo:
    ArchLinux
Re:Bitmap too large to be uploaded into a texture
« Risposta #4 il: 29 Ottobre 2013, 07:25:41 CET »
0
Ma in questo modo non posso neanche caricare le immagini scattate con la fotocamera del telefono  :-(

La gallery come fa a caricare foto di dimensioni superiori al limite della GPU?
Vuoi diventare uno sviluppatore Android? Segui i miei tutorial su http://svappdroid.com

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Bitmap too large to be uploaded into a texture
« Risposta #5 il: 29 Ottobre 2013, 14:59:22 CET »
0
Il problema è nel visualizzare l'immagine, caricala in memoria se c'è spazio libero e non superi i limiti imposti dal sistema operativo per le  app puoi farlo. Non credo che hai un device con uno schermo maggiore di 2k x 2k pixel.
adb logcat | tee /tmp/logcat | grep TAG

Offline Tizionario

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Github
    • Google+
    • tizionario
    • tizionario
    • Mostra profilo
    • Svappdroid
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Tizionario
  • Sistema operativo:
    ArchLinux
Re:Bitmap too large to be uploaded into a texture
« Risposta #6 il: 29 Ottobre 2013, 15:06:24 CET »
0
No ma tramite la gallery riesco a visualizzare anche foto molto grandi (più di 5000px per lato), vorrei capire come fare per evitare l'insorgere del problema.
Vuoi diventare uno sviluppatore Android? Segui i miei tutorial su http://svappdroid.com

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Bitmap too large to be uploaded into a texture
« Risposta #7 il: 29 Ottobre 2013, 16:21:27 CET »
0
Il software della gallery è intelligente, elabora le immagini prima di visualizzarle con filtri tipo ridimensionamento e/o ritaglio. Tieni anche conto che certi programmi di gallery non sono scritti in Java, o meglio hanno una parte scritta in C/C++ per allocare le immagini in memoria (non hanno i limiti imposti dalla Dalvik) e per elaborarle molto velocemente.
adb logcat | tee /tmp/logcat | grep TAG

Offline Tizionario

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Github
    • Google+
    • tizionario
    • tizionario
    • Mostra profilo
    • Svappdroid
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Tizionario
  • Sistema operativo:
    ArchLinux
Re:Bitmap too large to be uploaded into a texture
« Risposta #8 il: 30 Ottobre 2013, 09:42:39 CET »
0
Vero, infatti dal codice sorgente dell'app gallery non riesco a trovare nulla circa il resize, evidentemente per quello è stato usato NDK...sai consigliarmi qualche risorsa (oltre alla documentazione ufficiale) per capirci meglio sul caricamento delle immagini?
Vuoi diventare uno sviluppatore Android? Segui i miei tutorial su http://svappdroid.com

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Bitmap too large to be uploaded into a texture
« Risposta #9 il: 30 Ottobre 2013, 14:46:31 CET »
0
Vero, infatti dal codice sorgente dell'app gallery non riesco a trovare nulla circa il resize, evidentemente per quello è stato usato NDK...sai consigliarmi qualche risorsa (oltre alla documentazione ufficiale) per capirci meglio sul caricamento delle immagini?
i sorgenti ci sono anche per le parti NDK
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia