android 通过图片url获取宽高_Android 根据图片url获取bitmap或者drawable,然后再进行压缩处理...

在做微信分享大图的时候遇到了这个问题,需要通过图片url生成Bitmap,而大家也经常会遇到下面几种情况:

1.通过图片url生成Bitmap对象和Drawable对象。

2.对网络上获取到的图片进行压缩处理。

在此写篇文章,下面提供一个工具类,以后就可以直接拿来用了

/**

* 图片处理工具类

*/

public class ImageUtils {

private int picType;//0表示默认png图片;1表示jpg或者jpeg

public static ImageUtils getIntance(){

return new ImageUtils();

}

public void setPicType(int picType) {

this.picType = picType;

}

/**

* 质量压缩

*/

public Bitmap compressImage(Bitmap image) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

Bitmap.CompressFormat Type=picType==0?Bitmap.CompressFormat.PNG:Bitmap.CompressFormat.JPEG;

//image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

image.compress(Type, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

int options = 100;

while (baos.toByteArray().length / 1024 > 100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩

baos.reset();//重置baos即清空baos

image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中

options -= 10;//每次都减少10

}

ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中

Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片

return bitmap;

}

/**

* 图片按比例大小压缩方法(根据路径获取图片并压缩)

*/

public Bitmap getimage(String srcPath) {

BitmapFactory.Options newOpts = new BitmapFactory.Options();

//开始读入图片,此时把options.inJustDecodeBounds 设回true了

newOpts.inJustDecodeBounds = true;

Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);//此时返回bm为空

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;//设置缩放比例

//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了

bitmap = BitmapFactory.decodeFile(srcPath, newOpts);

return compressImage(bitmap);//压缩好比例大小后再进行质量压缩

}

/**

* 图片按比例大小压缩方法(根据Bitmap图片压缩)

*/

public 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

Bitmap.CompressFormat Type=picType==0?Bitmap.CompressFormat.PNG:Bitmap.CompressFormat.JPEG;

//image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中

image.compress(Type, 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;//设置缩放比例

//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了

isBm = new ByteArrayInputStream(baos.toByteArray());

bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);

return compressImage(bitmap);//压缩好比例大小后再进行质量压缩

}

/**判断图片类型*/

public void getPicTypeByUrl(String url){

if(url==null){

return;

}

if(url.equals("")){

return;

}

String[] picArray=url.split("/");

String picStr="";

if(picArray.length>0){

picStr=picArray[picArray.length-1];

}else{

picStr=picArray[0];

}

if(picStr.toLowerCase().contains(".png")){

picType=0;

}else if(picStr.toLowerCase().contains(".jpg")||picStr.toLowerCase().contains(".jpeg")){

picType=1;

}

}

/**通过图片url生成Bitmap对象

* @param urlpath

* @return Bitmap

* 根据图片url获取图片对象

*/

public static Bitmap getBitMBitmap(String urlpath) {

Bitmap map = null;

try {

URL url = new URL(urlpath);

URLConnection conn = url.openConnection();

conn.connect();

InputStream in;

in = conn.getInputStream();

map = BitmapFactory.decodeStream(in);

} catch (IOException e) {

e.printStackTrace();

}

return map;

}

/**通过图片url生成Drawable对象

* @param urlpath

* @return Bitmap

* 根据url获取布局背景的对象

*/

public static Drawable getDrawable(String urlpath){

Drawable drawable = null;

try {

URL url = new URL(urlpath);

URLConnection conn = url.openConnection();

conn.connect();

InputStream in;

in = conn.getInputStream();

drawable = Drawable.createFromStream(in, "background.jpg");

} catch (IOException e) {

e.printStackTrace();

}

return drawable;

}

}

大家可根据实际需求进行代码修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值