xutils按照图片的比例压缩接口
2017-07-06 11:12
190 查看
package com.example.myapplication; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import org.xutils.common.Callback; import org.xutils.common.util.DensityUtil; import org.xutils.image.ImageOptions; import org.xutils.x; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; public class MainActivity extends AppCompatActivity { private ImageView image; private ImageOptions imageOptions2; private ImageView image2; private Bitmap bitmap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); x.Ext.init(getApplication()); image = (ImageView) findViewById(R.id.image); image2 = (ImageView) findViewById(R.id.image2); if(imageOptions2==null){ imageOptions2 = new ImageOptions.Builder() // .setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120)) // .setRadius(DensityUtil.dip2px(5)) // 如果ImageView的大小不是定义为wrap_content, 不要crop.设置成fasle就好了 // .setCrop(false) // 很多时候设置了合适的scaleType也不需要它. // 加载中或错误图片的ScaleType //.setPlaceholderScaleType(ImageView.ScaleType.MATRIX) // .setImageScaleType(ImageView.ScaleType.FIT_XY) .setLoadingDrawableId(R.mipmap.ic_launcher)//加载中的图片 .setFailureDrawableId(R.mipmap.ic_launcher)//默认的图片 .build(); } x.image().loadDrawable( "h a834 ttp://img01.tooopen.com/Downs/images/2010/4/10/sy_20100410100959952919.jpg", imageOptions2, new Callback.CommonCallback<Drawable>() { @Override public void onSuccess(Drawable result) { BitmapDrawable bd = (BitmapDrawable) result; bitmap = bd.getBitmap(); Bitmap comp = comp(bitmap); image.setImageBitmap(comp); } @Override public void onError(Throwable ex, boolean isOnCallback) { image.setImageResource(R.mipmap.ic_launcher); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); x.image().loadDrawable( "http://wenwen.soso.com/p/20120208/20120208225353-1466244753.jpg", imageOptions2, new Callback.CommonCallback<Drawable>() { @Override public void onSuccess(Drawable result) { BitmapDrawable bd = (BitmapDrawable) result; bitmap = bd.getBitmap(); Bitmap comp = comp(bitmap); image2.setImageBitmap(comp); } @Override public void onError(Throwable ex, boolean isOnCallback) { image.setImageResource(R.mipmap.ic_launcher); } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); } private Bitmap comp(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出 baos.reset();//重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到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; //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 float hh = 800f;//这里设置高度为800f float ww = 480f;//这里设置宽度为480f //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 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); } if (be <= 0) be = 1; newOpts.inSampleSize = be;//设置缩放比例 newOpts.inPreferredConfig = Bitmap.Config.RGB_565;//降低图片从ARGB888到RGB565 //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 isBm = new ByteArrayInputStream(baos.toByteArray()); bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); return compressImage(bitmap);//压缩好比例大小后再进行质量压缩 } private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩 baos.reset();//重置baos即清空baos options -= 10;//每次都减少10 image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 return bitmap; } }
相关文章推荐
- PHP 图片操作(按照指定尺寸压缩,按照比例裁剪)
- JavaWeb后端自动按比例压缩图片并传输的接口
- javascript等比例压缩图片
- 一个可以使得上传的图片大小按照指定的宽度,高度自动按比例进行缩放的函数(C#)
- 将图片按照比例显示
- php等比例压缩图片(jpg,jif,png图片等比例压缩)
- 图片按比例缩小,并压缩保存
- 最新Javascript按比例压缩图片,解决onload无法读取图片的高度和宽度问题
- [源码分享]等比例压缩图片
- 上传图片按比例压缩
- 图片上传判断width 等比例压缩
- 最新javascript自动按比例显示图片,按比例压缩图片显示
- 用ASP.NET将原始图片按照指定大小按原始比例缩放显示图片
- .net上传图片并按照宽度高度比例缩小显示
- js图片等比例压缩
- 图片不变形,按照等比例缩小或扩大显示
- [原创]最新javascript自动按比例显示图片,按比例压缩图片显示
- 引用 java将图片切割成规定比例并将其压缩成固定大小
- 用css来强制按比例压缩图片的高度或宽度
- java将图片切割成规定比例并将其压缩成固定大小