2015-06-30 12 views
6

to obraz oryginału:Android ImageView przedstawia zielonkawy obraz

enter image description here

to renderowany obraz za ImageView:

enter image description here

Jednakże czasami, gdy obraz jest karuzeli Przesunięcie z powrotem do obrazu może spowodować poprawne wyświetlanie obrazu, co jest jeszcze dziwniejsze ...

To zachowanie jest obserwowane zarówno na LG G3 (Android 5.1) i Genymotion (Android 4.4.4). Używam biblioteki Glide dla ładowania obrazów, używając formatu ARGB_8888 dekodowania:

new GlideBuilder(this).setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); 
+0

Prześledźmy się na GitHub wydania: https://github.com/bumptech/glide/issues/515 –

Odpowiedz

7

To jest rozwiązany problem 305. Oto krótkie podsumowanie:

Ten problem pojawia się tylko w przypadku zdjęć w formacie JPEG (jakość nie ma znaczenia). Wygląda na to, że ma on znacznie większy wpływ niż ARGB_8888, więc możesz przełączyć DecodeFormat na ARGB_8888 (wyczyść dane aplikacji, aby sprawdzić, czy problem został rozwiązany). Ale może pojawić się nawet z ARGB_8888, więc użyć jednego z następujących rozwiązań:

  1. Zastosowanie DiskCacheStrategy.NONE (dla lokalnych obrazów) lub DiskCacheStrategy.SOURCE (dla zdalnych obrazów), aby zapobiec Glide z ponownego kompresję obrazów:

    Glide.with(this) 
        .load(url) 
        .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
        .into(imageView); 
    
  2. Zastosowanie asBitmap() i zwyczaj BitmapEncoder zawsze dotkniętych kompresji obrazów jako PNG:

    Glide.with(this) 
        .fromResource() 
        .asBitmap() 
        .encoder(new BitmapEncoder(Bitmap.CompressFormat.PNG,100)) 
        .load(R.drawable.testimg) 
        .into(imageView); 
    
+0

Dzięki diskCacheStrategy (DiskCacheStrategy.SOURCE) jest tutaj kluczem. Wszystkie odmiany DecodeFormat.PREFER_ARGB_8888/GlideBuilder/GlideModule są bezużyteczne przy wymuszaniu 24-bitowego koloru. – Ryan

+0

Nie działa dla mnie. Obrazy są nadal zielone – RexSplode

1

Na wypadek, gdyby ktoś próbował wszystkiego, co jest wymienione powyżej i nic z tego nie zadziałało (tak jak w moim przypadku), istnieje inne obejście tego problemu. Ponieważ zielonkawy kolor zachodzi podczas transformacji, możemy uniknąć transformacji.

Glide.with(context) 
    .load(url) 
    .dontTransform() 
    .into(holder.productImage); 
1
This issue may happen on few devices not all like one plus 3 or 3T and some LG devices when fetching imageUrl from server to your android project. 

public static void loadImageWith(Context context, String imageUrl, ImageView imageView) { 
    Glide.with(context) 
      .load(imageUrl) 
      .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
      .dontTransform() 
      .placeholder(R.drawable.empty_photo) 
      .into(imageView); 
    } 

centerCrop() may create issue, so avoid to use centerCrop(). 
+0

dobrze się dowiaduj !! –