mirror of
https://github.com/pierre42100/ComunicAndroid
synced 2024-11-23 22:09:30 +00:00
Fixed big image rendering issue
This commit is contained in:
parent
c2e599993b
commit
4f185600e2
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user