2012-01-13 12 views
6

Mam.png przechowywany jako zasób w mojej aplikacji na Androida. W moim kodu, ja allocationg nową instancję Bitmap z tego obrazu następująco:Nieprawidłowe wymiary obrazu w Androidzie podczas korzystania z pliku obrazu Bitmap

Bitmap img = BitmapFactory.decodeResource(getResources(), R.drawable.imgName); 

Ale kiedy czytam wymiary obrazu z obiektu Bitmap przy użyciu getWight() i getHeight() metody,

int width = img.getWidth(); 
int height = img.getHeight(); 

Otrzymuję różne wyniki od oryginalnego obrazu ... Czy ktoś może mi wyjaśnić, czego mi brakuje i jak mogę odzyskać rozmiar obrazu?

(Mój projekt jest zgodne z Android 2.2 - API 8)

Edit: OK - okazało się, jak uzyskać rzeczywiste wymiary: ustawień inJustDecodeBounds właściwość klasy BitmapFactory.Options true następująco:

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(getResources(), R.drawable.imgName, options); 
    width = options.outWidth; 
    height = options.outHeight; 

problem jest teraz, że dekoder zwraca null gdy wyślemy Options argumentu, więc muszę rozszyfrować ponownie tak jak ja wcześniej (bez Options argumentu ...), aby pobrać Bitmap instancji -bizarre, isnt to?

Odpowiedz

3

Android skaluje obraz dla różnych gęstości (w pewnym sensie dla różnych rozdzielczości i rozmiarów ekranu). Umieść oddzielną kopię swojego obrazu w drawable-ldpi, drawable-hdpi, drawable-xhdpi, folderach do rysowania.

+0

Dziękuję za odpowiedź, ale czy wiesz, jeśli istnieje sposób, aby uzyskać "prawdziwy" rozmiar obrazu? –

+0

@ET najprostszym sposobem jest hardcoding to. W każdym razie będziesz znał rozmiar obrazu, który umieściłeś w folderze do rysowania. szczerze mówiąc, nie próbowałem uzyskać rzeczywistego rozmiaru. – manjusg

+1

Nie mogę używać tych rozwiązań, ponieważ zdjęcia są dość dynamiczne i mogą zostać odzyskane z serwisu internetowego w przyszłości. Poza tym - mam mnóstwo zdjęć :) –

8

Aby uzyskać dokładny obraz wykorzystania zasobów:

BitmapFactory.Options o = new Options(); 
    o.inScaled = false; 
    Bitmap watermark = BitmapFactory.decodeResource(context.getResources(), id, o); 

ten wyłącza automatyczne skalowanie gęstości ekran.

Aktualizacja: Jestem pewien, że już to sobie uświadomiłeś, ale inJustDecodeBounds właśnie to robi, znajduje wymiary. Nie dostaniesz obrazu. Ta opcja jest ogólnie przeznaczona do niestandardowego skalowania. Skończyć się nazywając decodeResource dwa razy, drugi ustawienie czasu:

options.inJustDecodeBounds = false; 

i dokonywania jakichkolwiek korekt do opcji na podstawie listy:

width = options.outWidth; 
height = options.outHeight; 
+0

Może nie być tym, czego szukał OP, ale to na pewno bardzo mi pomogło, dziękuję. – r41n

+0

dziękuję bardzo, to było dla mnie niezwykle przydatne! – noobcoder

Powiązane problemy