2013-07-13 13 views
22

Ciągle mam ten problem i nie wiem, co z tym zrobić.Kanał: próbuję użyć przetworzonej mapy bitowej Android

Użyłem biblioteki this i kiedy dostaję przycięty obraz, zapisuję go w zmiennej statycznej i przechodzę do następnej czynności. Kiedy dochodzę do następnej czynności, odwołuję się do tej statycznej zmiennej, aby uzyskać bitmapę i spróbować ją skalować. Ale daje mi błąd.

Oto, co robię.

public void buttonCropClick(View view) throws IOException 
{ 
    imageView.setDrawingCacheEnabled(true); 
    imageView.buildDrawingCache(true); 
    Snapshot.CroppedBitmap = imageView.getDrawingCache(true); 
    imageView.setDrawingCacheEnabled(false); 
    startActivity(new Intent(this,RecommendationInfo.class)); 
} 

w klasie RecommendationInfo, mam bitmapy w następujący wiersz Snapshot.CroppedBitmap = imageView.getDrawingCache(true); potem zapisać bitmapę w statycznej zmiennej której odwoływać się w następnej aktywności i przekazać je do następujących funkcji.

public static Bitmap scaleDown(Bitmap realImage,boolean filter) { 

    float maxImageSize = HeightToSet; 
    float ratio = Math.min(
      (float) maxImageSize/realImage.getWidth(), 
      (float) maxImageSize/realImage.getHeight()); 
    int width = Math.round((float) ratio * realImage.getWidth()); 
    int height = Math.round((float) ratio * realImage.getHeight()); 

    // Error here 
    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,height, filter); 
    return newBitmap; 
} 

Próbowałem już dzwonić pod numer bitmap.recycle(). Dlaczego otrzymuję ten problem, co mogę zrobić, aby go rozwiązać? Oto mój logcat.

07-14 03:09:43.713: E/AndroidRuntime(19653): FATAL EXCEPTION: main 
07-14 03:09:43.713: E/AndroidRuntime(19653): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Canvas.throwIfRecycled(Canvas.java:955) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Canvas.drawBitmap(Canvas.java:1012) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Bitmap.createBitmap(Bitmap.java:462) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.Libraries.Snapshot.scaleDown(Snapshot.java:42) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo.SetRecommendationValues(RecommendationInfo.java:195) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo.access$5(RecommendationInfo.java:183) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.example.androidtestproject.RecommendationInfo$1.onClick(RecommendationInfo.java:154) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.view.View.performClick(View.java:2552) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.view.View$PerformClick.run(View.java:9229) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Handler.handleCallback(Handler.java:587) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.os.Looper.loop(Looper.java:138) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at android.app.ActivityThread.main(ActivityThread.java:3701) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at java.lang.reflect.Method.invokeNative(Native Method) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at java.lang.reflect.Method.invoke(Method.java:507) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
07-14 03:09:43.713: E/AndroidRuntime(19653): at dalvik.system.NativeStart.main(Native Method) 
07-14 03:09:45.515: E/TAG(20039): End of input at character 0 of 
+0

Jaki błąd dostałeś? – Alamri

+0

Mam zaktualizowane pytanie, proszę sprawdzić – Mj1992

+0

Twoja mapa bitowa jest gdzieś recyklowana, nie możesz wywołać bitmapy po jej przetworzeniu. zobacz, czy przetwarzasz bitmapę, czy nie, przed rozpoczęciem drugiej aktywności. – k0sh

Odpowiedz

37

Skopiuj mapę bitową przed przekazaniem jej do zmiennej statycznej.

Snapshot.CroppedBitmap = imageView.getDrawingCache(true); 

do

Snapshot.CroppedBitmap = Bitmap.createBitmap(imageView.getDrawingCache(true)); 

Jest bardzo prawdopodobne, że ImageView jest recykling swój bufor rysowania, gdy nie są już potrzebne jako dobre praktyki. Kopiując go, zachowujesz odniesienie do mapy bitowej, do której został przeniesiony ImageView. Po prostu zrób kopię, którą sam sobie poradzisz!

+0

thnx dużo ludzi, twoje rozwiązanie jest zwięzłe i dokładne :) – Mj1992

+0

Mam nadzieję, że pomógł. Twoje zdrowie! – AStupidNoob

+0

Dzięki ... pomógł mi też ... – Vamshi

3

Trzeba skopiować obraz źródłowy pierwszy:

Bitmap bitmap = webview.getDrawingCache(); 
if (bitmap != null) { 
     Snapshot.CroppedBitmap.setImageBitmap(bitmap.copy(bitmap.getConfig(), false)); 
} 
  • Korzystanie createBitmap nie koniecznie utworzyć kopię bitmapy źródłowej, co powoduje ten sam błąd.
+0

java.lang.IllegalStateException: Nie mogę skopiować zregenerowanej bitmapy – joecizac

Powiązane problemy