mirror of
				https://github.com/pierre42100/ComunicAndroid
				synced 2025-11-04 11:34:06 +00:00 
			
		
		
		
	Fixed big image rendering issue
This commit is contained in:
		@@ -1,7 +1,10 @@
 | 
			
		||||
package org.communiquons.android.comunic.client.data.ImageLoad;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.BitmapFactory;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
 | 
			
		||||
import org.communiquons.android.comunic.client.data.utils.BitmapUtils;
 | 
			
		||||
import org.communiquons.android.comunic.client.data.utils.Utilities;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
@@ -19,6 +22,11 @@ import java.net.URL;
 | 
			
		||||
 | 
			
		||||
class ImageDownloadRunnable implements Runnable {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Debug tag
 | 
			
		||||
     */
 | 
			
		||||
    private static final String TAG = "ImageDownloadRunnable";
 | 
			
		||||
 | 
			
		||||
    private String url;
 | 
			
		||||
    private File dest;
 | 
			
		||||
 | 
			
		||||
@@ -55,17 +63,34 @@ class ImageDownloadRunnable implements Runnable {
 | 
			
		||||
 | 
			
		||||
            conn.connect();
 | 
			
		||||
 | 
			
		||||
            //Get image size
 | 
			
		||||
            long img_size = Long.decode(conn.getHeaderField("Content-Length"));
 | 
			
		||||
 | 
			
		||||
            //Get input stream
 | 
			
		||||
            InputStream is = conn.getInputStream();
 | 
			
		||||
 | 
			
		||||
            //Process image
 | 
			
		||||
            Bitmap image = BitmapFactory.decodeStream(is);
 | 
			
		||||
            image.compress(Bitmap.CompressFormat.PNG, 100, os);
 | 
			
		||||
            //Log action
 | 
			
		||||
            Log.v(TAG, "Downloading image (size: "+img_size+") at " + url);
 | 
			
		||||
 | 
			
		||||
            os.close();
 | 
			
		||||
            //Big images have to written byte per byte
 | 
			
		||||
            Utilities.InputToOutputStream(is, os);
 | 
			
		||||
 | 
			
		||||
            //Close streams and disconnect
 | 
			
		||||
            is.close();
 | 
			
		||||
            os.close();
 | 
			
		||||
            conn.disconnect();
 | 
			
		||||
 | 
			
		||||
            //Reduce image size
 | 
			
		||||
            Bitmap bitmap = BitmapUtils.openResized(dest, 500, 500);
 | 
			
		||||
 | 
			
		||||
            //Write the new bitmap to the file
 | 
			
		||||
            os = new FileOutputStream(dest, false);
 | 
			
		||||
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
 | 
			
		||||
            os.close();
 | 
			
		||||
 | 
			
		||||
            //Free memory
 | 
			
		||||
            bitmap.recycle();
 | 
			
		||||
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,11 @@ import java.io.FileInputStream;
 | 
			
		||||
 | 
			
		||||
class ImageLoadRunnable implements Runnable {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Debug tag
 | 
			
		||||
     */
 | 
			
		||||
    private static final String TAG = "ImageLoadRunnable";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * An array map with all the pending images associated with their URLs
 | 
			
		||||
     */
 | 
			
		||||
@@ -136,6 +141,9 @@ class ImageLoadRunnable implements Runnable {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Log action
 | 
			
		||||
        Log.v(TAG, "Load image downloaded from " + url);
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            //Load the image
 | 
			
		||||
            FileInputStream is = new FileInputStream(file);
 | 
			
		||||
@@ -146,7 +154,7 @@ class ImageLoadRunnable implements Runnable {
 | 
			
		||||
            if(bitmap == null){
 | 
			
		||||
                //Return error
 | 
			
		||||
                Log.e("ImageLoadManagerRunnabl", "Image file could not be read, therefore it was" +
 | 
			
		||||
                        "deleted");
 | 
			
		||||
                        " deleted");
 | 
			
		||||
 | 
			
		||||
                //Delete file
 | 
			
		||||
                file.delete();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,12 @@
 | 
			
		||||
package org.communiquons.android.comunic.client.data.utils;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.BitmapFactory;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.util.Base64;
 | 
			
		||||
 | 
			
		||||
import java.io.ByteArrayOutputStream;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Bitmap utilities
 | 
			
		||||
@@ -58,4 +59,57 @@ public class BitmapUtils {
 | 
			
		||||
        //Scale and return bitmap
 | 
			
		||||
        return Bitmap.createScaledBitmap(bitmap, newW, newH, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Open a resized format of an image to avoid OOM Fatal error
 | 
			
		||||
     *
 | 
			
		||||
     * @param file The file to open
 | 
			
		||||
     * @param reqWidth The required width
 | 
			
		||||
     * @param reqHeight The required height
 | 
			
		||||
     */
 | 
			
		||||
    public static Bitmap openResized(@NonNull File file, int reqWidth, int reqHeight){
 | 
			
		||||
 | 
			
		||||
        //Get the size of the image
 | 
			
		||||
        BitmapFactory.Options options = new BitmapFactory.Options();
 | 
			
		||||
        options.inJustDecodeBounds = true;
 | 
			
		||||
        BitmapFactory.decodeFile(file.getAbsolutePath(), options);
 | 
			
		||||
 | 
			
		||||
        //Calculate the reduction ratio
 | 
			
		||||
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
 | 
			
		||||
 | 
			
		||||
        //Decode Bitmap with new parametres
 | 
			
		||||
        options.inJustDecodeBounds = false;
 | 
			
		||||
        return BitmapFactory.decodeFile(file.getAbsolutePath(), options);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Calculate the in sample size
 | 
			
		||||
     *
 | 
			
		||||
     * @param options The Options of the Bitmap Factory that already contains the with and the
 | 
			
		||||
     *                height of the image
 | 
			
		||||
     * @param reqW The required width
 | 
			
		||||
     * @param reqH The required Height
 | 
			
		||||
     * @return The reduction ratio required for the image
 | 
			
		||||
     */
 | 
			
		||||
    private static int calculateInSampleSize(BitmapFactory.Options options, int reqW, int reqH){
 | 
			
		||||
 | 
			
		||||
        //Raw the width and the height of the image
 | 
			
		||||
        int width = options.outWidth;
 | 
			
		||||
        int height = options.outHeight;
 | 
			
		||||
        int inSampleSize = 1;
 | 
			
		||||
 | 
			
		||||
        //Check if the image has to be resized
 | 
			
		||||
        if(height > reqH || width > reqW){
 | 
			
		||||
 | 
			
		||||
            int halfHeight = height / 2;
 | 
			
		||||
            int halfWidth = width / 2;
 | 
			
		||||
 | 
			
		||||
            while((halfHeight / inSampleSize) >= reqH && (halfWidth / inSampleSize) >= reqW)
 | 
			
		||||
                inSampleSize *= 2;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return inSampleSize;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,19 +2,15 @@ package org.communiquons.android.comunic.client.data.utils;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.res.Resources;
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.text.Html;
 | 
			
		||||
import android.text.TextUtils;
 | 
			
		||||
import android.util.Base64;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.util.Patterns;
 | 
			
		||||
 | 
			
		||||
import org.communiquons.android.comunic.client.R;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedReader;
 | 
			
		||||
import java.io.ByteArrayOutputStream;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
@@ -176,25 +172,20 @@ public class Utilities {
 | 
			
		||||
     *
 | 
			
		||||
     * @param is The Input stream
 | 
			
		||||
     * @param os The output stream
 | 
			
		||||
     * @return The number of byte transfered
 | 
			
		||||
     */
 | 
			
		||||
    public static int InputToOutputStream(InputStream is, OutputStream os){
 | 
			
		||||
    public static void InputToOutputStream(InputStream is, OutputStream os){
 | 
			
		||||
 | 
			
		||||
        int count = 0;
 | 
			
		||||
        int read = 0;
 | 
			
		||||
        byte[] bytes = new byte[2048];
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            int b = is.read();
 | 
			
		||||
            while (b != -1){
 | 
			
		||||
                os.write(b);
 | 
			
		||||
                count++;
 | 
			
		||||
                b = is.read();
 | 
			
		||||
            while ((read = is.read(bytes)) != -1){
 | 
			
		||||
                os.write(bytes, 0, read);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        } catch (IOException e){
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return count;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user