Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android pinch zoom large image, memory efficient without losing detail

My app has to display a number of high resolution images (about 1900*2200 px), support pinch zoom. To avoid Out of memory error I plan to decode image to show full screen by using

options.inSampleSize = scale (scale was calculated as Power of 2 as Document)

(My view i used is TouchImageView extends of ImageView)

So i can quickly load image and swipe smoothly between screens(images). However, when i pinch zoom, my app loses detail because of scaled image. If i load full image, i can't load quickly or smoothly swipe, drag after pinch zoom. Then i try to only load full image when user begin pinch-zooming, but i still can't drag smoothly image because of very large image. Android gallery can do it perfectly even 8Mpx images.

Anyone can help me. Thanks in advance

like image 741
Kiradev Avatar asked Mar 02 '13 14:03

Kiradev


People also ask

Which image format is best for android apps?

In android the best format of Image is PNG as it light compare to JPG,JPEG etc.So its easy to draw and take less time to perform the operation while using these images.

How do you pinch zoom on android?

Tap anywhere on the screen, except the keyboard or navigation bar. Drag 2 fingers to move around the screen. Pinch with 2 fingers to adjust zoom. To stop magnification, use your magnification shortcut again.

What format does android save photos?

Android apps typically use images that are in one or more of the following file formats: AVIF, PNG, JPG, and WebP.


2 Answers

Sorry to answer an old question, but I've just completed an image view that shows an image from assets or external storage with subsampling, and loads higher resolution tiles from the image as you pinch to zoom in. As high resolution image data for areas of the screen is not loaded it should avoid out of memory exceptions.

https://github.com/davemorrissey/subsampling-scale-image-view

like image 185
Dave Morrissey Avatar answered Oct 22 '22 04:10

Dave Morrissey


I know the question was asked a long time ago but this answer might help other people struggling with this. I had exactly the same issue. You should consider using WebView and load your image with it, even if it is a local image. For instance to load an image in assets use the following:

// Get a WebView you have defined in your XML layout    
WebView webView = (WebView) findViewById(R.id.webView1);  
// Fetch the picture in your folders using HTML             
String htmlData = "<img src=\"my_image.png\">";
webView.loadDataWithBaseURL("file:///android_asset/", htmlData, "text/html", "utf-8", null);
// Activate zooming
webView.getSettings().setBuiltInZoomControls(true);

I admit that it is very strange to use WebView for such a task, it is the only solution I found. At least you will never get an OOM exception.

like image 39
Remi D Avatar answered Oct 22 '22 05:10

Remi D