概述
1:根据Picasso 获取图片的宽高
Picasso.with(this).load(uri).transform(transformation).into(image_first);
Transformation transformation = new Transformation() {
@Override
public Bitmap transform(Bitmap source) {
int targetWidth = 0;
Log.e(TAG, "source.getHeight()=" + source.getHeight());
Log.e(TAG, "source.getWidth()=" + source.getWidth());
Log.e(TAG, "targetWidth=" + targetWidth);
if (source.getWidth() == 0) {
return source;
}
//如果图片小于设置的宽度,则返回原图
if (source.getWidth() < targetWidth) {
return source;
} else {
//如果图片大小大于等于设置的宽度,则按照设置的宽度比例来缩放
double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
Log.e(TAG, "transform: aspectRatio=" + aspectRatio);
int targetHeight = (int) (targetWidth * aspectRatio);
Log.e(TAG, "transform: targetHeight=" + targetHeight);
if (targetHeight != 0 && targetWidth != 0) {
Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
if (result != source) {
// Same bitmap is returned if sizes are the same
Log.e(TAG, "transform: result.getWidth()=" + result.getWidth());
Log.e(TAG, "transform: result.getHeight()=" + result.getHeight());
source.recycle();
}
return result;
} else {
return source;
}
}
}
@Override
public String key() {
return "transformation" + " desiredWidth";
}
};
Glide 获取图片宽高
//获取图片真正的宽高
Glide.with(this).asBitmap().load(str).into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Log.e(TAG, "onResourceReady: width=" + width);
Log.e(TAG, "onResourceReady: height=" + height);
image_second.setImageBitmap(compressQualityBitmap(bitmap));
image_third.setImageBitmap(compressScale(bitmap));
}
});
//质量压缩
public Bitmap compressQualityBitmap(Bitmap bitmap) {
Log.e(TAG, "compressQualityBitmap: bitmap.getWidth=" + bitmap.getWidth());
Log.e(TAG, "compressQualityBitmap: bitmap.getHeight=" + bitmap.getHeight());
Log.e(TAG, "compressQualityBitmap: bitmap.getDensity=" + bitmap.getDensity());
//
Log.e(TAG, "compressQualityBitmap: bitmap.getByteCount="+bitmap.getByteCount() +",内存="+formatFloat(Float.valueOf((float) (bitmap.getByteCount()*1.0/1024))));
float f = Float.valueOf(formatFloat(Float.valueOf((float) (bitmap.getByteCount() * 1.0 / 1024))));
Log.e(TAG, "compressQualityBitmap: 内存=" + formatFloat(f / 1024));
if (bitmap != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int options = 100;
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
while (baos.toByteArray().length / 1024 > 100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
Log.e(TAG, "compressQualityBitmap: baos.toByteArray().length=" + baos.toByteArray().length);
baos.reset();
options -= 5;
if (options < 0) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 5, baos);
break;
}
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos); //这里压缩options%,把压缩后的数据存放到baos中
}
byte[] bitmapArray = baos.toByteArray();
Log.e(TAG, "compressQualityBitmap: bitmapArray=" + bitmapArray.length);
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap newBitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
newOpts.inJustDecodeBounds = false;
newOpts.inPreferredConfig = Bitmap.Config.RGB_565;//降低图片从ARGB888到RGB565
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
newBitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
if (newBitmap != null) {
Log.e(TAG, "compressQualityBitmap: !=null");
Log.e(TAG, "compressQualityBitmap: newBitmap.getWidth" + newBitmap.getWidth());
Log.e(TAG, "compressQualityBitmap: newBitmap.getHeight" + newBitmap.getHeight());
Log.e(TAG, "compressQualityBitmap: newBitmap.getDensity" + newBitmap.getDensity());
Log.e(TAG, "compressQualityBitmap: newBitmap.getByteCount" + newBitmap.getByteCount());
float f2 = Float.valueOf(formatFloat(Float.valueOf((float) (newBitmap.getByteCount() * 1.0 / 1024))));
Log.e(TAG, "compressQualityBitmap:新内存= " + formatFloat(f2 / 1024));
return newBitmap;
} else {
Log.e(TAG, "compressQualityBitmap: ==null");
return null;
}
} else {
return null;
}
}
/**
* 保留两位小数
*/
public String formatFloat(Float value) {
if (value == null) {
return "0.00";
}
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
return df.format(value);
}
/**
* 图片按比例大小压缩方法
*
* @param image (根据Bitmap图片压缩)
*
be 控制压缩比例
* @return
*/
public static Bitmap compressScale(Bitmap image) {
Log.e(TAG, "compressScale: " + image.getWidth());
Log.e(TAG, "compressScale: " + image.getHeight());
Log.e(TAG, "compressScale: " + image.getDensity());
Log.e(TAG, "compressScale: " + image.getByteCount());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
Log.e(TAG, w + "---------------" + h);
// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
// float hh = 800f;// 这里设置高度为800f
// float ww = 480f;// 这里设置宽度为480f
float hh = 300f;
float ww = 400f;
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;// be=1表示不缩放
if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) { // 如果高度高的话根据高度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
Log.e(TAG, "compressScale: be=" + be);
if (be <= 0)
be = 1;
//
newOpts.inSampleSize = be; // 设置缩放比例
newOpts.inSampleSize = 2; // 测试缩放两倍 be=2
// newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
Log.e(TAG, "compressScale: bitmap.getWidth()=" + bitmap.getWidth());
Log.e(TAG, "compressScale: bitmap.getHeight()=" + bitmap.getHeight());
Log.e(TAG, "compressScale: bitmap.getDensity()=" + bitmap.getDensity());
Log.e(TAG, "compressScale: bitmap.getByteCount() =" + bitmap.getByteCount());
return bitmap;// 压缩好比例大小后再进行质量压缩
//return bitmap;
}
最后
以上就是独特小懒猪为你收集整理的android 图片压缩的全部内容,希望文章能够帮你解决android 图片压缩所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复