private Bitmap decodeImage(String imageUri) throws IOException {
   ViewScaleType viewScaleType = imageAware.getScaleType();
   ImageDecodingInfo decodingInfo =
       new ImageDecodingInfo(
           memoryCacheKey, imageUri, targetSize, viewScaleType, getDownloader(), options);
   return decoder.decode(decodingInfo);
 }
  /** Decodes image file into Bitmap, resize it and save it back */
  private void resizeAndSaveImage(File targetFile, int maxWidth, int maxHeight) throws IOException {
    // Decode image file, compress and re-save it
    ImageSize targetImageSize = new ImageSize(maxWidth, maxHeight);
    DisplayImageOptions specialOptions =
        new DisplayImageOptions.Builder()
            .cloneFrom(options)
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
            .build();
    ImageDecodingInfo decodingInfo =
        new ImageDecodingInfo(
            memoryCacheKey,
            Scheme.FILE.wrap(targetFile.getAbsolutePath()),
            targetImageSize,
            ViewScaleType.FIT_INSIDE,
            getDownloader(),
            specialOptions);
    Bitmap bmp = decoder.decode(decodingInfo);
    if (bmp == null) return;

    if (configuration.processorForDiscCache != null) {
      log(LOG_PROCESS_IMAGE_BEFORE_CACHE_ON_DISC);
      bmp = configuration.processorForDiscCache.process(bmp);
      if (bmp == null) {
        L.e(ERROR_PROCESSOR_FOR_DISC_CACHE_NULL, memoryCacheKey);
        return;
      }
    }

    OutputStream os = new BufferedOutputStream(new FileOutputStream(targetFile), BUFFER_SIZE);
    try {
      bmp.compress(
          configuration.imageCompressFormatForDiscCache,
          configuration.imageQualityForDiscCache,
          os);
    } finally {
      IoUtils.closeSilently(os);
    }
    bmp.recycle();
  }