2012-11-14 36 views
6

Điều tôi muốn làm là vẽ một hình ảnh ra màn hình, tại vị trí bạn chọn.Vẽ một phần hình ảnh thành màn hình (không tải tất cả vào bộ nhớ)

Tôi có thể dễ dàng tải mẫu này vào một bitmap. và sau đó vẽ một phần phụ.

Nhưng khi hình ảnh lớn, điều này rõ ràng sẽ làm cạn kiệt bộ nhớ.

Màn hình của tôi là bản xem lướt sóng. Vì vậy, có một canvas vv

Vậy làm cách nào tôi có thể vẽ một phần của hình ảnh, tại một độ lệch đã cho và thay đổi kích thước. Nếu không tải nguồn gốc vào bộ nhớ

Tôi tìm thấy câu trả lời phù hợp với các dòng bên phải, nhưng nó không hoạt động chính xác. Với việc sử dụng các drawables từ tập tin. Cố gắng mã dưới đây. Ngoài việc thay đổi kích thước ngẫu nhiên nó tạo ra, nó cũng không đầy đủ.

Ví dụ:

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

Hãy xem 'BitmapRegionDecoder'. Hãy suy nghĩ điều này thực hiện chính xác những gì bạn đang tìm kiếm. – bobnoble

+0

@bobnoble Cảm ơn bạn đã xem qua các javadocs, có vẻ như điều đó sẽ làm điều đó. Và khá thẳng về phía trước để sử dụng. – Doomsknight

+0

Viết như một câu trả lời @bobnoble - nó hữu ích và sẽ tiếp tục cho những người khác. – Elemental

Trả lời

5

BitmapRegionDecoder có thể được sử dụng để tải một khu vực cụ thể của một hình ảnh. Dưới đây là một phương pháp ví dụ thiết lập bitmap trong hai ImageView s. Đầu tiên là hình ảnh đầy đủ, send chỉ là một khu vực đầy đủ hình ảnh:

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(); 
} 

Kết quả là hình ảnh đầy đủ (trên cùng) và chỉ là một khu vực của hình ảnh (dưới):

enter image description here

+1

Cảm ơn câu trả lời tuyệt vời :) – Doomsknight

Các vấn đề liên quan