Handling High Resolution Images in Phimpme Android
In Android, loading heavy and high resolution images is a difficult task. For instance, if we try to load a photo clicked at a resolution four times that of the screen and try to load it in an imageview, it may result in an app’s crash due to the OutOFMemory exception. It happens because at the run time of our application some limited memory is allocated to our application and if we exceed that by loading a high quality images. To make a perfect gallery application, one must take care of all the possible causes for application crashes. In Phimpme Android, we have done this with the help of Glide library with some other tweaks to help catch all possible causes for the OutOfMemory exceptions. In this tutorial, I will be discussing how we have displayed heavy images with the help of Glide library and other tweaks to avoid the above mentioned exception.
Step 1:
To avoid the OutOFMemory exception, first we have to add the below line of code in the AndroidManifest.xml file.
android:largeHeap=”true”
What this piece of code does is that it increases the amount of heap memory that is allocated at the time of run time of the application. Hence, more heap memory, less chance of running out of memory.
Step 2:
To load the images into the image view we can make use of the Glide library as it is the most recommended way to do it according to the Google’s Android developer page to cache bitmaps. The below code helps us to load the image in the imageView using a pager adapter.
Glide.with(getContext()) .load(img.getUri()) .asBitmap().format(DecodeFormat.PREFER_RGB_565) .signature(useCache ? img.getSignature(): new StringSignature(new Date().getTime()+"")) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .thumbnail(0.5f) .transform(new RotateTransformation(getContext(), img.getOrientation(), false)) .animate(R.anim.fade_in) .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) { photoView.setImageBitmap(bitmap); } });
This is the way we have done it in the Phimpme Android application using the Glide library. We are loading the image as a bitmap and by preferring the bitmap RGB565 as it consumes 50% less memory than the RGB8888 model which may be the type of the original image. Of course the image quality will seem bit less but it is not noticeable until we zoom in to full extent.
The next thing we are doing is caching the image in the memory using the below line of code using Glide library.
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
As caching images offers faster access to the images. It also helps in avoiding the OutOfMemory crashes when we are using a large list of images. Link to cache images without using the Glide library is mentioned in the resources section below. After this, we are loading the image in the PhotoView which is a module we are using in the Phimpme Android application, which extends to the imageView and comes with many zooming images functionalities.
This is how we have implemented the loading of images in the gallery view in Phimpme Android application so that it can handle resolution of any sizes without running out of memory. To get the full source code on how to load high resolution images, please refer to the Phimpme Android repository.
Resource
- Introduction to glide image loader: https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
- Google developer guide to cache bitmaps without using glide library : https://developer.android.com/topic/performance/graphics/cache-bitmap.html.
- Google developer guide to OutOfMemory Exceptions: https://developer.android.com/reference/java/lang/OutOfMemoryError.html
- LeafPic GitHub repository: https://github.com/HoraApps/LeafPic