Search code examples
androidimagedrawable

Android load drawable programmatically and resize it


How can I load drawable from InputStream (assets, file system) and resize it dynamically based on the screen resolution hdpi, mdpi or ldpi?

The original image is in hdpi, I only need resizing for mdpi and ldpi.

How does Android do dynamic resizing of the drawables in /res?


Solution

  • Found it:

      /**
       * Loads image from file system.
       * 
       * @param context the application context
       * @param filename the filename of the image
       * @param originalDensity the density of the image, it will be automatically
       * resized to the device density
       * @return image drawable or null if the image is not found or IO error occurs
       */
      public static Drawable loadImageFromFilesystem(Context context, String filename, int originalDensity) {
        Drawable drawable = null;
        InputStream is = null;
    
        // set options to resize the image
        Options opts = new BitmapFactory.Options();
        opts.inDensity = originalDensity;
    
        try {
          is = context.openFileInput(filename);
          drawable = Drawable.createFromResourceStream(context.getResources(), null, is, filename, opts);         
        } catch (Exception e) {
          // handle
        } finally {
          if (is != null) {
            try {
              is.close();
            } catch (Exception e1) {
              // log
            }
          }
        }
        return drawable;
      }
    

    Use like this:

    loadImageFromFilesystem(context, filename, DisplayMetrics.DENSITY_MEDIUM);