Autore Topic: applicazione in crash quando eseguo createBitmap  (Letto 975 volte)

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
applicazione in crash quando eseguo createBitmap
« il: 22 Agosto 2012, 18:10:11 CEST »
0
Ciao ragazzi,

ho un problema quando tento di ritagliare un'immagine da un'immagine più grande presa dalla fotocamera frontale. Ho questo codice che mi permette di salvare l'immagine così com'è

Codice: [Seleziona]
        public boolean storeByteImage(PreviewDemo mContext, byte[] imageData, int quality, String expName, Face face, Camera camera) {
               
                File sdImageMainDirectory = new File("/sdcard");
                FileOutputStream fileOutputStream = null;
                try {
                        sdImageMainDirectory.createNewFile();
                        BitmapFactory.Options options=new BitmapFactory.Options();
                        options.inSampleSize = 1;
                       
                        Rect rect = face.rect;

                        int centerX = rect.centerX();
                        int centerY = rect.centerY();
                       
                        Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0, imageData.length,options);
                                               
                        fileOutputStream = new FileOutputStream(sdImageMainDirectory.toString() +"/image_" + counter++ + ".jpg");
                       
                        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
                        myImage.compress(CompressFormat.JPEG, quality, bos);

                        bos.flush();
                        bos.close();
                       

                } catch (NullPointerException e) {
                        e.printStackTrace();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }

                return true;
        }

Per ritagliare una parte dell'immagine ho aggiunto questa riga
Codice: [Seleziona]
                        Bitmap cropped = Bitmap.createBitmap(myImage, 1, 1, rect.width()-50, rect.height()-50, null, false); //provo a ritagliare un'immagine quasi quanto l'originale per vedere se funzina

e poi una riga più in basso che comprime l'immagine in jpeg analogamente a quanto fatto per myImage. Purtroppo non funziona, se inserisco la riga sopra l'applicazione va in crash. Sapete dirmi dove sbaglio?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:applicazione in crash quando eseguo createBitmap
« Risposta #1 il: 22 Agosto 2012, 18:16:33 CEST »
0
Prima cosa dovresti postare il LogCat dell'errore, così da avere almeno un'idea della causa.

Nel frattempo, tirando ad indovinare, potrebbe trattarsi di un problema di dimensioni dell'immagine (troppo grande). In tal caso, potresti provare con immagini piccole per verificare che il tuo codice sia funzionalmente valido.

La documentazione ufficiale riporta questi suggerimenti sulle bitmap:
Displaying Bitmaps Efficiently | Android Developers
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:applicazione in crash quando eseguo createBitmap
« Risposta #2 il: 23 Agosto 2012, 09:36:00 CEST »
0
Grazie per la risposta, ora provo a ridimensionarla ma non credo sia questo il problema, perché se provo a salvare l'immagine originale senza ritagliarla ci riesco. Si tratta di un'immagine presa dalla fotocamera frontale del telefono. Nel frattempo ecco il logcat, è normale che sia così lungo? Anche dopo che l'applicazione va in crash continuo a ricevere una valanga di messaggi (quì ho stoppoato pochi istanti dopo che l'applicazione è andata in crash). Ieri non l'ho postato perché dopo aver fatto un clear (sto usando eclipse) non usciva più, sai dirmi questo perché succede? Grazie

Codice: [Seleziona]
?:??: W/?(?): [ 08-22 16:55:52.962  6075: 6075 D/libEGL   ]
?:??: W/?(?): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
?:??: W/?(?): [ 08-22 16:55:52.970  6075: 6075 D/libEGL   ]
?:??: W/?(?): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
?:??: W/?(?): [ 08-22 16:55:53.056  6075: 6075 D/OpenGLRenderer ]
?:??: W/?(?): Enabling debug mode 0
?:??: W/?(?): [ 08-22 16:55:53.119   126:  327 D/DOMX     ]
?:??: W/?(?): ERROR: failed check:(eError == OMX_ErrorNone) || (eError == OMX_ErrorNoMore) - returning error: 0x80001005 - Error returned from OMX API in ducati
?:??: W/?(?): [ 08-22 16:55:53.119   126:  327 E/CameraHAL ]
?:??: W/?(?): Error while configuring rotation 0x80001005
?:??: W/?(?): [ 08-22 16:55:53.134   529:  529 E/AppsCustomizePagedView ]
?:??: W/?(?): Widget ComponentInfo{com.google.android.ears/com.google.android.ears.widget.EarsMusicWidgetProvider} can not fit on this device (600, 120)
?:??: W/?(?): [ 08-22 16:55:53.173   529:  529 E/AppsCustomizePagedView ]
?:??: W/?(?): Widget ComponentInfo{flipboard.app/flipboard.widget.FlipboardWidgetSmall} can not fit on this device (588, 144)
?:??: W/?(?): [ 08-22 16:55:53.173   529:  529 E/AppsCustomizePagedView ]
?:??: W/?(?): Widget ComponentInfo{flipboard.app/flipboard.widget.FlipboardWidgetMedium} can not fit on this device (588, 292)
?:??: W/?(?): [ 08-22 16:55:53.173   529:  529 E/AppsCustomizePagedView ]
?:??: W/?(?): Widget ComponentInfo{com.alphonso.pulse/com.alphonso.pulse.widget.PulseWidgetProviderSmall} can not fit on this device (594, 96)
?:??: W/?(?): [ 08-22 16:55:53.173   529:  529 E/AppsCustomizePagedView ]
?:??: W/?(?): Widget ComponentInfo{com.alphonso.pulse/com.alphonso.pulse.widget.PulseWidgetProviderBig} can not fit on this device (594, 288)
?:??: W/?(?): [ 08-22 16:55:53.181   529:  529 E/AppsCustomizePagedView ]
?:??: W/?(?): Widget ComponentInfo{com.joelapenna.foursquared/com.joelapenna.foursquared.appwidget.FriendsAppWidgetProvider} can not fit on this device (588, 292)
?:??: W/?(?): [ 08-22 16:55:53.181   529:  529 E/AppsCustomizePagedView ]
?:??: W/?(?): Widget ComponentInfo{com.joelapenna.foursquared/com.joelapenna.foursquared.appwidget.VenuesAppWidgetProvider} can not fit on this device (588, 144)
?:??: W/?(?): [ 08-22 16:55:53.189   529:  529 E/AppsCustomizePagedView ]
?:??: W/?(?): Widget ComponentInfo{com.google.android.apps.docs/com.google.android.apps.docs.widget.CakemixAppWidgetProvider} can not fit on this device (588, 120)
?:??: W/?(?): [ 08-22 16:55:53.236   126:  327 D/DOMX     ]
?:??: W/?(?): ERROR: failed check:(eError == OMX_ErrorNone) || (eError == OMX_ErrorNoMore) - returning error: 0x80001005 - Error returned from OMX API in ducati
?:??: W/?(?): [ 08-22 16:55:53.236   126:  327 E/CameraHAL ]
?:??: W/?(?): Error while configuring rotation 0x80001005
?:??: W/?(?): [ 08-22 16:55:53.478   126:  705 E/CameraHAL ]
?:??: W/?(?): Adapter state switch PREVIEW_ACTIVE Invalid Op! event = 0xf
?:??: W/?(?): [ 08-22 16:55:53.595   126:  126 E/CameraHAL ]
?:??: W/?(?): Preview is not running
?:??: W/?(?): [ 08-22 16:55:53.595  6075: 6075 D/PreviewDemo ]
?:??: W/?(?): Error stopping camera preview: stop face detection failed
?:??: W/?(?): [ 08-22 16:55:53.642   126:  705 D/DOMX     ]
?:??: W/?(?): ERROR: failed check:(eError == OMX_ErrorNone) || (eError == OMX_ErrorNoMore) - returning error: 0x80001005 - Error returned from OMX API in ducati
?:??: W/?(?): [ 08-22 16:55:53.642   126:  705 E/CameraHAL ]
?:??: W/?(?): Error while configuring rotation 0x80001005
?:??: W/?(?): [ 08-22 16:55:53.798   126:  705 D/DOMX     ]
?:??: W/?(?): ERROR: failed check:(eError == OMX_ErrorNone) || (eError == OMX_ErrorNoMore) - returning error: 0x80001005 - Error returned from OMX API in ducati
?:??: W/?(?): [ 08-22 16:55:53.798   126:  705 E/CameraHAL ]
?:??: W/?(?): Error while configuring rotation 0x80001005
?:??: W/?(?): [ 08-22 16:55:53.923  6075: 6075 I/Choreographer ]
?:??: W/?(?): Skipped 57 frames!  The application may be doing too much work on its main thread.
?:??: W/?(?): [ 08-22 16:55:53.962   126: 6092 D/         ]
?:??: W/?(?): PPM: Standby to first shot: Sensor Change completed -  :360.718 ms :  1345647353967 ms
?:??: W/?(?): [ 08-22 16:55:53.994   529:  529 W/IInputConnectionWrapper ]
?:??: W/?(?): showStatusIcon on inactive InputConnection
?:??: W/?(?): [ 08-22 16:55:54.009   306:  337 I/ActivityManager ]
?:??: W/?(?): Displayed com.commonsware.android.camera/.PreviewDemo: +1s611ms
?:??: W/?(?): [ 08-22 16:55:54.728  6075: 6075 I/CAMERA   ]
?:??: W/?(?): Faccia riconosciuta: 100
?:??: W/?(?): [ 08-22 16:55:54.916   126: 6092 D/         ]
?:??: W/?(?): PPM: Shot to snapshot:  :219.818 ms :  1345647354919 ms
?:??: W/?(?): [ 08-22 16:55:54.931   126: 6092 D/         ]
?:??: W/?(?): PPM: Shot to Jpeg:  :241.333 ms :  1345647354940 ms
?:??: W/?(?): [ 08-22 16:55:54.947  6075: 6088 D/dalvikvm ]
?:??: W/?(?): GC_FOR_ALLOC freed 77K, 3% free 10787K/11011K, paused 27ms, total 27ms
?:??: W/?(?): [ 08-22 16:55:54.947  6075: 6088 I/dalvikvm-heap ]
?:??: W/?(?): Grow heap (frag case) to 11.004MB for 460816-byte allocation
?:??: W/?(?): [ 08-22 16:55:54.978  6075: 6079 D/dalvikvm ]
?:??: W/?(?): GC_CONCURRENT freed 1K, 3% free 11236K/11527K, paused 13ms+2ms, total 31ms
?:??: W/?(?): [ 08-22 16:55:55.002  6075: 6075 D/dalvikvm ]
?:??: W/?(?): GC_FOR_ALLOC freed 450K, 6% free 10929K/11527K, paused 14ms, total 14ms
?:??: W/?(?): [ 08-22 16:55:55.017  6075: 6075 D/AndroidRuntime ]
?:??: W/?(?): Shutting down VM
?:??: W/?(?): [ 08-22 16:55:55.017  6075: 6075 W/dalvikvm ]
?:??: W/?(?): threadid=1: thread exiting with uncaught exception (group=0x40c33300)
?:??: W/?(?): [ 08-22 16:55:55.017  6075: 6075 E/AndroidRuntime ]
?:??: W/?(?): FATAL EXCEPTION: main
?:??: W/?(?): java.lang.IllegalArgumentException: x + width must be <= bitmap.width()
?:??: W/?(?):         at android.graphics.Bitmap.createBitmap(Bitmap.java:533)
?:??: W/?(?):         at com.commonsware.android.camera.MyFaceDetectionListener.storeByteImage(MyFaceDetectionListener.java:104)
?:??: W/?(?):         at com.commonsware.android.camera.MyFaceDetectionListener$4.onPictureTaken(MyFaceDetectionListener.java:59)
?:??: W/?(?):         at android.hardware.Camera$EventHandler.handleMessage(Camera.java:734)
?:??: W/?(?):         at android.os.Handler.dispatchMessage(Handler.java:99)
?:??: W/?(?):         at android.os.Looper.loop(Looper.java:137)
?:??: W/?(?):         at android.app.ActivityThread.main(ActivityThread.java:4745)
?:??: W/?(?):         at java.lang.reflect.Method.invokeNative(Native Method)
?:??: W/?(?):         at java.lang.reflect.Method.invoke(Method.java:511)
?:??: W/?(?):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
?:??: W/?(?):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
?:??: W/?(?):         at dalvik.system.NativeStart.main(Native Method)
?:??: W/?(?): [ 08-22 16:55:55.017   306: 4317 W/ActivityManager ]
?:??: W/?(?):   Force finishing activity com.commonsware.android.camera/.PreviewDemo
?:??: W/?(?): [ 08-22 16:55:55.072   306:  343 I/InputReader ]
?:??: W/?(?): Reconfiguring input devices.  changes=0x00000004
?:??: W/?(?): [ 08-22 16:55:55.072   306:  343 I/InputReader ]
?:??: W/?(?): Device reconfigured: id=6, name='Melfas MMSxxx Touchscreen', surface size is now 720x1280, mode is 1
?:??: W/?(?): [ 08-22 16:55:55.158   306:  320 I/ActivityManager ]
?:??: W/?(?): Config changed: {1.0 999mcc0mnc en_US sw360dp w360dp h567dp nrml port finger -keyb/v/h -nav/h s.33}
?:??: W/?(?): [ 08-22 16:55:55.556   306:  319 W/ActivityManager ]
?:??: W/?(?): Activity pause timeout for ActivityRecord{4198bea0 com.commonsware.android.camera/.PreviewDemo}
?:??: W/?(?): [ 08-22 16:55:57.377   306:  337 D/dalvikvm ]
?:??: W/?(?): WAIT_FOR_CONCURRENT_GC blocked 0ms
?:??: W/?(?): [ 08-22 16:55:57.494   306:  337 D/dalvikvm ]
?:??: W/?(?): GC_EXPLICIT freed 1678K, 19% free 18829K/23239K, paused 8ms+13ms, total 120ms
?:??: W/?(?): [ 08-22 16:55:59.181  6075: 6075 I/Process  ]
?:??: W/?(?): Sending signal. PID: 6075 SIG: 9
?:??: W/?(?): [ 08-22 16:55:59.212   126:  705 E/CameraHAL ]
?:??: W/?(?): Adapter state switch PREVIEW_ACTIVE Invalid Op! event = 0x5
« Ultima modifica: 23 Agosto 2012, 09:44:03 CEST da titanum »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:applicazione in crash quando eseguo createBitmap
« Risposta #3 il: 23 Agosto 2012, 09:47:26 CEST »
+1
La causa pare essere questa (scorri il LogCat):

Citazione
java.lang.IllegalArgumentException: x + width must be <= bitmap.width()

Ed è avvenuta alla riga indicata qua:

Citazione
         at com.commonsware.android.camera.MyFaceDetectionListener.storeByteImage(MyFaceDetectionListener.java:104)

Presumo sia l'istruzione aggiunta:

Codice (Java): [Seleziona]
Bitmap cropped = Bitmap.createBitmap(myImage, 1, 1, rect.width()-50, rect.height()-50, null, false);
Dove a quanto pare rect.width()-50 è maggiore delle dimensioni di myImage.

A prescindere che sia vero o no, è buona norma far precedere tale istruzione da una validazione dei parametri che gli passi, cioè controlla che myImage non sia null, controlla che le dimensioni che passi siano minori o uguali a quelle della bitmap. Prendendo questa abitudine, si perdono pochi secondi in più nello scrivere il codice, ma ti ritrovi il debug gratis e non perdi ore o giorni nel rincorrere problemi.

Se poi la riga era un'altra, postala o indicala.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:applicazione in crash quando eseguo createBitmap
« Risposta #4 il: 23 Agosto 2012, 12:11:10 CEST »
0
Grazie bradipao, alla fine la causa era una riga di codice analoga alla riga che ho aggiunto e che non usavo più, e ho dimenticato di togliere... Ora vorrei chiederti un'altra cosa: ho modificato la riga
Codice: [Seleziona]
Bitmap cropped = Bitmap.createBitmap(myImage, 1, 1, rect.width()-50, rect.height()-50, null, false);in questo modo:
Codice: [Seleziona]
Bitmap cropped = Bitmap.createBitmap(myImage, centerX, centerY, 200, 200, null, false);
il mio obiettivo è ritagliare il viso dal resto dell'immagine, e rect è un rettangolo restituito dal driver che contiene i confini dell'immagine. Il problema è che restituisce un valore negativo, ho provato molte correzioni ma sforo sempre il limite di myImage.width(). Come faresti?
Quì ho trovato la descrizione di rect, ma non mi è chiaro

Rect | Android Developers