2012-11-14 9 views
6

Co chcę zrobić, to narysuj wycięcie obrazu na ekranie, w wybranej przeze mnie pozycji.Narysuj część obrazu na ekranie (bez wczytywania całości do pamięci)

Mogę dość łatwo załadować to do bitmapy. a następnie narysuj podsekcję.

Ale gdy obraz jest duży, to oczywiście wyczerpuje pamięć.

Mój ekran to widok powierzchni. A więc ma płótno itp.

Jak mogę narysować część obrazu, przy danym przesunięciu i zmienić rozmiar. Bez ładowania oryginału do pamięci

Znalazłem odpowiedź, która wyglądała wzdłuż właściwych linii, ale nie działa poprawnie. Za pomocą rysunków z pliku. Próba kodu poniżej. Oprócz losowych rozmiarów, które produkuje, jest również niekompletne.

przykład:

Example

Drawable img = Drawable.createFromPath(Files.SDCARD + image.rasterName); 

    int drawWidth = (int) (image.GetOSXWidth()/(maxX - minX)) * m_canvas.getWidth();   
    int drawHeight = (int)(image.GetOSYHeight()/(maxY - minY)) * m_canvas.getHeight(); 

    // Calculate what part of image I need... 
    img.setBounds(0, 0, drawWidth, drawHeight); 

    // apply canvas matrix to move before draw...? 
    img.draw(m_canvas); 
+3

Zobacz 'BitmapRegionDecoder'. Pomyśl, że to dokładnie to, czego szukasz. – bobnoble

+0

@bobnoble Dzięki przeglądając javadocs, wygląda na to, że to wystarczy. I jest całkiem prosty w użyciu. – Doomsknight

+0

Napisz to jako odpowiedź @bobnoble - jest przydatna i będzie nadal dla innych. – Elemental

Odpowiedz

5

BitmapRegionDecoder mogą być stosowane do ładowania określony obszar obrazu. Oto przykładowa metoda ustawiania mapy bitowej w dwóch s. ImageView. Pierwszym z nich jest pełny obraz, send to właśnie region pełnego obrazu:

private void configureImageViews() { 

    String path = externalDirectory() + File.separatorChar 
      + "sushi_plate_tokyo_20091119.png"; 

    ImageView fullImageView = (ImageView) findViewById(R.id.fullImageView); 
    ImageView bitmapRegionImageView = (ImageView) findViewById(R.id.bitmapRegionImageView); 

    Bitmap fullBitmap = null; 
    Bitmap regionBitmap = null; 

    try { 
     BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder 
       .newInstance(path, false); 

     // Get the width and height of the full image 
     int fullWidth = bitmapRegionDecoder.getWidth(); 
     int fullHeight = bitmapRegionDecoder.getHeight(); 

     // Get a bitmap of the entire image (full plate of sushi) 
     Rect fullRect = new Rect(0, 0, fullWidth, fullHeight); 
     fullBitmap = bitmapRegionDecoder.decodeRegion(fullRect, null); 

     // Get a bitmap of a region only (eel only) 
     Rect regionRect = new Rect(275, 545, 965, 1025); 
     regionBitmap = bitmapRegionDecoder.decodeRegion(regionRect, null); 

    } catch (IOException e) { 
     // Handle IOException as appropriate 
     e.printStackTrace(); 
    } 

    fullImageView.setImageBitmap(fullBitmap); 
    bitmapRegionImageView.setImageBitmap(regionBitmap); 

} 

// Get the external storage directory 
public static String externalDirectory() { 
    File file = Environment.getExternalStorageDirectory(); 
    return file.getAbsolutePath(); 
} 

rezultatem jest pełny obraz (u góry) i tylko obszar obrazu (na dole):

enter image description here

+1

Doskonała odpowiedź dzięki :) – Doomsknight

Powiązane problemy