2014-10-08 12 views
12

Jak wyciąć prostokątny obraz (600 x 300) z lewej i prawej strony, aby zmieścić się w kwadratowym ImageView? Nie chcę, aby zmienić rozmiar obrazu, po prostu chcę, aby go przyciąć, aby być 300 x 300.Przycinanie obrazu do kwadratu - Android

[ROZWIĄZANIE]

Jak @blackbelt powiedział

Bitmap cropImg = Bitmap.createBitmap(src, startX, startY, dstWidth, dstHeight);

jest wielki do przycinania obrazów. Jak więc automatycznie przycinać obrazy o różnych rozmiarach? Tworzę ten prosty kod, który:

// From drawable 
Bitmap src= BitmapFactory.decodeResource(context.getResources(), R.drawable.image); 

// From URL 
Bitmap src = null; 
try { 
    String URL = "http://www.example.com/image.jpg"; 
    InputStream in = new java.net.URL(URL).openStream(); 
    src = BitmapFactory.decodeStream(in); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

int width = src.getWidth(); 
int height = src.getHeight(); 
int crop = (width - height)/2; 
Bitmap cropImg = Bitmap.createBitmap(src, crop, 0, height, height); 

ImageView.setImageBitmap(cropImg); 

Odpowiedz

3

Można użyć

Bitmap dst = Bitmap.createBitmap(src, startX, startY, dstWidth, dstHeight); 

z dokumentacji:

Zwraca niezmienny bitmapę z określonego podzbioru źródłowego bitmapy. Nowa bitmapa może być tym samym obiektem, co źródło, lub może zostać wykonana kopia. Jest inicjowany z tą samą gęstością, co oryginalna mapa bitowa .

Here można znaleźć w dokumentacji

16

Expanding trochę na odpowiedź powyżej

Ponieważ w niektórych sytuacjach można skończyć z wyjątkiem lub nie oczekiwany wynik, tylko za pomocą Bitmap.createBitmap(), podobnie jak odłogowanie:

java.lang.IllegalArgumentException: x + szerokość musi być < = bitmap.width()

Heres jest mała funkcja nie plon i uchwyt niektórych przypadkach Gmin.

Edytuj: zaktualizowano zgodnie z oświadczeniem droidstera.

public static Bitmap cropToSquare(Bitmap bitmap){ 
    int width = bitmap.getWidth(); 
    int height = bitmap.getHeight(); 
    int newWidth = (height > width) ? width : height; 
    int newHeight = (height > width)? height - (height - width) : height; 
    int cropW = (width - height)/2; 
    cropW = (cropW < 0)? 0: cropW; 
    int cropH = (height - width)/2; 
    cropH = (cropH < 0)? 0: cropH; 
    Bitmap cropImg = Bitmap.createBitmap(bitmap, cropW, cropH, newWidth, newHeight); 

    return cropImg; 
} 

Zrobiłem kilka testów z obrazami o różnych rozdzielczościach i rozmiarach i działało zgodnie z oczekiwaniami.

Może być również używany w innych sytuacjach, na przykład przy próbach zrobienia "idealnie" okrągłego obrazu i przejścia przez kwadratową bitmapę itp.

+1

To jest dokładnie to, czego szukasz, aby uzyskać idealnie okrągłe obrazy i nie owalne. Jeśli jednak wysokość obrazu jest większa niż szerokość, nie jest przycinana w środku, ponieważ wartość y param wynosi 0 w metodzie createBitmap. Oto, jak można to naprawić: Dodaj te 2 linie: 'int cropH = (height - width)/2; \t cropH = (cropH <0)? 0: cropH; 'Użyj wartości cropH jako y. \t 'Bitmap cropImg = Bitmap.createBitmap (mapa bitowa, cropW, cropH, newWidth, newHeight);' –

+0

Fajnie, widzę twój punkt .... Zasadniczo, aby wykonać te same obliczenia zarówno dla szerokości jak i wysokości. –

1

zestaw wysokość widok Niezmienny obraz, szerokość i ustawić dwie właściwości aby zobaczyć

android:adjustViewBounds="true" 
android:scaleType="centerCrop" 

wykonanej

Powiązane problemy