Ładuję mapę bitową do ImageView i widzę ten błąd. Rozumiem, że ten limit odnosi się do limitu rozmiaru tekstur sprzętowych OpenGL (2048x2048). Obraz, który muszę załadować, to powiększony przez szczypanie obraz o wysokości około 4000 pikseli.
Próbowałem wyłączyć akcelerację sprzętową w manifeście, ale bez radości.
<application
android:hardwareAccelerated="false"
....
>
Czy można załadować obraz większy niż 2048 pikseli do ImageView?
inSampleSize
podejście.Odpowiedzi:
Całe renderowanie jest oparte na OpenGL, więc nie, nie możesz przekroczyć tego limitu (w
GL_MAX_TEXTURE_SIZE
zależności od urządzenia, ale minimum to 2048x2048, więc każdy obraz niższy niż 2048x2048 będzie pasował).Przy tak dużych obrazach, jeśli chcesz pomniejszyć i na telefonie komórkowym, powinieneś skonfigurować system podobny do tego, który widzisz na przykład na mapach Google. Z obrazem podzielonym na kilka części i kilkoma definicjami.
Lub możesz zmniejszyć obraz przed wyświetleniem go (zobacz odpowiedź użytkownika1352407 na to pytanie).
Uważaj także, w którym folderze umieścisz obraz, Android może automatycznie skalować obrazy. Spójrz na odpowiedź pilota_51 poniżej na to pytanie.
źródło
To nie jest bezpośrednia odpowiedź na pytanie (ładowanie obrazów> 2048), ale możliwe rozwiązanie dla każdego, kto doświadcza błędu.
W moim przypadku obraz był mniejszy niż 2048 w obu wymiarach (dokładnie 1280x727), a problem wystąpił szczególnie w Galaxy Nexus. Obraz znajdował się w
drawable
folderze, a żaden z kwalifikowanych folderów. Android zakłada, że rysunki bez kwalifikatora gęstości są mdpi i skaluje je w górę lub w dół dla innych gęstości, w tym przypadku przeskalowane w górę 2x dla xhdpi. Przeniesienie obrazu winowajcy na,drawable-nodpi
aby zapobiec skalowaniu, rozwiązało problem.źródło
drawable
zasadniczo utworzyć ukrytydrawable-mdpi
folder. To wyjaśniało również, dlaczego moje niestandardowe znaczniki mapy wyglądały okropnie (były przeskalowywane, a następnie zmniejszane).Obraz zmniejszyłem w ten sposób:
źródło
ctx
oznacza?Zamiast spędzać wiele godzin na próbach ręcznego pisania / debugowania całego tego kodu próbkującego, dlaczego by nie użyć
Picasso
? Został stworzony do radzenia sobie zebitmaps
wszystkimi typami i / lub rozmiarami.Użyłem tej pojedynczej linii kodu, aby usunąć problem „zbyt duża mapa bitowa ...” :
źródło
Pomogło mi dodanie następujących 2 atrybutów w (
AndroidManifest.xml
):źródło
Zmiana pliku obrazu na
drawable-nodpi
folder zdrawable
folderu zadziałała dla mnie.źródło
drawable
folderze.Użyłem Picassa i miałem ten sam problem. obraz był zbyt duży, przynajmniej pod względem rozmiaru, szerokości lub wysokości. w końcu znalazłem tutaj rozwiązanie. możesz skalować duży obraz w dół zgodnie z rozmiarem wyświetlacza, a także zachować proporcje:
i użyj tej metody wczytywania obrazu przez Picassa:
również dla lepszej wydajności możesz pobrać obraz według szerokości i wysokości ekranu wyświetlacza, a nie całego obrazu:
i wtedy:
EDYCJA: getDisplaySize ()
display.getWidth()/getHeight()
jest przestarzałe. ZamiastDisplay
używaćDisplayMetrics
.źródło
BitmapRegionDecoder
Zrób sztuczkę.Możesz nadpisać
onDraw(Canvas canvas)
, rozpocząć nowy wątek i zdekodować obszar widoczny dla użytkownika.źródło
Jak wskazał Larcho, zaczynając od poziomu API 10, możesz użyć
BitmapRegionDecoder
do załadowania określonych regionów z obrazu, a dzięki temu możesz wyświetlić duży obraz w wysokiej rozdzielczości, przydzielając w pamięci tylko potrzebne regiony. Niedawno opracowałem bibliotekę, która zapewnia wizualizację dużych obrazów z obsługą gestów dotykowych. Kod źródłowy i próbki są dostępne tutaj .źródło
Poziom widoku
Możesz wyłączyć przyspieszanie sprzętowe dla pojedynczego widoku w czasie wykonywania za pomocą następującego kodu:
myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);
źródło
Przeszedłem przez ten sam problem, oto moje rozwiązanie. ustaw szerokość obrazu taką samą jak szerokość ekranu Androida, a następnie skaluje wysokość
Jest to lepsze dla ekranu Androida o dowolnym rozmiarze. daj mi znać, czy to działa dla Ciebie.
źródło
Zmniejsz obraz:
Obraz zostanie zmniejszony do rozmiaru reqHeight i reqWidth. Jak rozumiem, inSampleSize przyjmuje tylko 2 wartości.
źródło
Użyj biblioteki Glide zamiast bezpośredniego ładowania do widoku obrazu
Glide: https://github.com/bumptech/glide
źródło
Wypróbowałem wszystkie powyższe rozwiązania, jedno po drugim, przez wiele godzin i żadne z nich nie działało! W końcu postanowiłem rozejrzeć się za oficjalnym przykładem robienia zdjęć aparatem Androida i ich wyświetlania. Oficjalny przykład ( tutaj ) dał mi wreszcie jedyną metodę, która zadziałała. Poniżej przedstawiam rozwiązanie, które znalazłem w tej przykładowej aplikacji:
źródło
UWAGA DLA OSÓB, KTÓRZY CHCĄ WPROWADZAĆ ZDJĘCIA MAŁEGO ROZMIARU
Rozwiązanie Pilot_51 (przenoszenie obrazów do
drawable-nodpi
folderu) działa, ale ma inny problem: powoduje, że obrazy na ekranie są ZBYT MAŁE, chyba że obrazy są przeskalowane do bardzo dużej (np. 2000 x 3800) rozdzielczości, aby zmieścić się na ekranie - wtedy aplikacja jest cięższa .ROZWIĄZANIE : włóż pliki graficzne
drawable-hdpi
- dla mnie zadziałało jak urok.źródło
Użycie odpowiedniego podfolderu do rysowania rozwiązało to za mnie. Moim rozwiązaniem było umieszczenie mojego obrazu w pełnej rozdzielczości (1920x1200) w folderze drawable-xhdpi zamiast folderu do rysowania .
Umieściłem również zmniejszony obraz (1280x800) do folderu drawable-hdpi .
Te dwie rozdzielczości pasują do tabletów Nexus 7 z 2013 i 2012 roku, które programuję. Przetestowałem to rozwiązanie również na kilku innych tabletach.
źródło
Ten kod działa
źródło