package ezy.sdk3rd.social.share.image;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.Log;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class ImageTool {
public static final int SIZE_3M = 3072;
public static int MAX_WIDTH = 768;
public static int MAX_HEIGHT = 1024;
public static byte[] compress(Bitmap bitmap, int maxSize, Bitmap.CompressFormat format) {
ByteArrayOutputStream os = null;
try {
int size = bitmap.getRowBytes() * bitmap.getHeight();
int quality = 100;
if (size > maxSize) {
quality = (int) (1f * quality * maxSize / size);
}
Log.d("compress", "compress quality:" + quality);
os = new ByteArrayOutputStream();
bitmap.compress(format, quality, os);
return os.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
close(os);
}
return null;
}
public static byte[] compress(byte[] bytes, int maxSize, Bitmap.CompressFormat format) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
byte[] out = compress(bitmap, maxSize, format);
bitmap.recycle();
return out;
}
public static byte[] compress(File file, int maxSize, Bitmap.CompressFormat format) {
if ((file == null) || (!file.getAbsoluteFile().exists())) {
return null;
}
Bitmap bitmap = BitmapFactory.decodeFile(file.toString());
byte[] out = compress(bitmap, maxSize, format);
bitmap.recycle();
return out;
}
public static byte[] compressCircularly(Bitmap bitmap, int maxSize, Bitmap.CompressFormat format) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
for (int i = 1; i <= 10; i++) {
bitmap.compress(format, (int) (100 * Math.pow(0.8, i)), os);
Log.e("compress", "size = " + os.size());
if (os.size() > maxSize) {
break;
} else {
os.reset();
}
}
return os.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
close(os);
}
return null;
}
public static byte[] compressCircularly(byte[] bytes, int maxSize, Bitmap.CompressFormat format) {
if (bytes == null || bytes.length <= maxSize) {
return bytes;
}
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
byte[] out = compressCircularly(bitmap, maxSize, format);
bitmap.recycle();
return out;
}
public static BitmapFactory.Options decodeScaledOptions(byte[] bytes, int maxWidth, int maxHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
int sw = (int) Math.ceil(options.outWidth / maxWidth);
int sh = (int) Math.ceil(options.outHeight / maxHeight);
if ((sh > 1) && (sw > 1)) {
options.inSampleSize = Math.max(sw, sh);
} else if (sh > 1) {
options.inSampleSize = sh;
} else if (sw > 1) {
options.inSampleSize = sw;
}
options.inJustDecodeBounds = false;
return options;
}
public static byte[] loadNetImage(String url) {
if (TextUtils.isEmpty(url)) {
return null;
}
ByteArrayOutputStream os = null;
InputStream is = null;
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setInstanceFollowRedirects(true);
connection.setConnectTimeout(30000);
connection.setReadTimeout(30000);
if (connection.getResponseCode() == 301) {
String redirect = connection.getHeaderField("Location");
if (redirect.equals(url)) {
Log.e("image", "重定向问题:url和重定向url相同");
return null;
}
return loadNetImage(redirect);
}
is = connection.getInputStream();
Log.d("image", "load image from url ==> " + url);
os = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int i;
while ((i = is.read(buffer)) != -1) {
os.write(buffer, 0, i);
}
return os.toByteArray();
} catch (Exception e) {
Log.e("image", "图片下载失败:" + e.getMessage());
return null;
} finally {
close(is);
close(os);
}
}
public static byte[] toBytes(Bitmap bitmap, Bitmap.CompressFormat format) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
bitmap.compress(format, 100, os);
return os.toByteArray();
}
public static byte[] toBytes(Context context, int resId, boolean raw, Bitmap.CompressFormat format) {
return toBytes(toBitmap(context, resId, raw), format);
}
public static Bitmap toBitmap(Context context, int resId, boolean raw) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
if (!raw) {
options.inScaled = true;
options.inTargetDensity = context.getResources().getDisplayMetrics().densityDpi;
}
return BitmapFactory.decodeResource(context.getResources(), resId, options);
}
public static Bitmap toBitmap(byte[] bytes) {
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
public static Bitmap toBitmap(File file) {
return BitmapFactory.decodeFile(file.toString());
}
public static Bitmap toBitmap(Drawable drawable) {
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createBitmap(w, h, config);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
drawable.draw(canvas);
return bitmap;
}
private static void close(Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void saveTo(byte[] bytes, File file) {
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(file));
bos.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
close(bos);
}
}
}