android基础学习之bitmap的常用用法

首先自己了解了一下屏幕分辨率的概念,手机的屏幕分辨率自己的理解大概就是像素值,如我们说的1080**720,而对应的手机的尺寸不同,所以其像素的密度也就不同,而图片都是由一个一个的像素点组成,就造成不同手机显示的图片有差异。

 

用到的屏幕分辨率  ldpi320:240                          

                                       mdpi:480:320

                                       hdpi:800:480

                                       xhdpi:1280*720

                                      xxhdpi:1920*1080

通常ui切图都是按800*480来切图,如果有条件再切一套1280*720的图

 

dp和像素之间有对象的转换规则,这个规则由像素密度来确定

800*480大概都是4寸(斜对角线)左右的大小,如果是4寸对应的像素密度为233,谷歌文档会告诉我们不同的像素密度对应的dppx的转换关系

 

所以dp也有一定得适配功能,但不能完全依仗。

dimen也可以实现屏幕的适配功能,其文件内写下相应分辨率所对应的dp值,在建立不用的values-分辨率的名字的文件,这样再加载布局的时候就会到相应的分辨率文件中找到自己的dp值。

 

终极适配:有的手机比如魅族的,针对相应的手机再写一套布局,创建不同的layout-分辨率文件。

 

publicstaticDrawable scaleBitmap(Bitmap bitmapOrg, int setwh, int setht) {

 

      // / 加载需要操作的图片,这里是eoeAndroidlogo图片

      // Bitmap bitmapOrg =BitmapFactory.decodeResource(getResources(),

      // R.drawable.eoe_android);

 

      // 获取这个图片的宽和高

      int width =bitmapOrg.getWidth();

      int height =bitmapOrg.getHeight();

 

      // 定义预转换成的图片的宽度和高度

      int newWidth = setwh;

      int newHeight = setht;

 

      // 计算缩放率,新尺寸除原始尺寸

      float scaleWidth = ((float) newWidth) / width;

      float scaleHeight = ((float) newHeight) / height;

 

      // 创建操作图片用的matrix对象

      Matrixmatrix = newMatrix();

 

      // 缩放图片动作

      matrix.postScale(scaleWidth,scaleHeight);

 

      // 旋转图片动作

      // matrix.postRotate(45);

 

      // 创建新的图片

      BitmapresizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width,

            height,matrix, true);

 

      // 将上面创建的Bitmap转换成Drawable对象,使得其可以使用在ImageView, ImageButton

      BitmapDrawablebmd = newBitmapDrawable(resizedBitmap);

 

      return bmd;

   }

 

 

/********************* DrawableBitmap ************************/

   publicstatic BitmapdrawabletoBitmap(Drawable drawable) {

      int width =drawable.getIntrinsicWidth();

      int height =drawable.getIntrinsicWidth();

 

      Bitmapbitmap = Bitmap.createBitmap(width, height, drawable

            .getOpacity()!= PixelFormat.OPAQUE? Bitmap.Config.ARGB_8888

            :Bitmap.Config.RGB_565);

      Canvascanvas = newCanvas(bitmap);

      drawable.setBounds(0,0, width, height);

 

      drawable.draw(canvas);

 

      return bitmap;

   }

 

 

//简单的下载网络图片

publicstaticBitmap getNetBitmap(String strUrl, Context context) {

      // LogUtil.e(TAG, "getBitmap from net");

      Bitmapbitmap = null;

      NetWorkUtil.getNetWorkInfoType(context);

      if (!NetWorkUtil.NO_NETWORK) {// 有网络

         try {

            URLurl = newURL(strUrl);

            HttpURLConnectioncon = (HttpURLConnection) url

                   .openConnection();

            con.setDoInput(true);

            con.connect();

            InputStreamin = con.getInputStream();

            bitmap= BitmapFactory.decodeStream(in);

            // FileOutputStream out = newFileOutputStream(file.getPath());

            // bitmap.compress(Bitmap.CompressFormat.PNG,100, out);

            // out.flush();

            // out.close();

            in.close();

         }catch(MalformedURLException e) {

            // bitmap=null;

            e.printStackTrace();

         }catch(IOException e) {

            // bitmap=null;

            e.printStackTrace();

         }finally{

 

         }

      }

      return bitmap;

   }

 

//将图片切成圆形

   publicstatic BitmaptoRoundBitmap(Bitmap bitmap) {

      int width =bitmap.getWidth();

      int height =bitmap.getHeight();

      float roundPx;

      float left, top, right,bottom, dst_left, dst_top, dst_right, dst_bottom;

      if (width <= height) {

         roundPx= width / 2;

         top= 0;

         bottom= width;

         left= 0;

         right= width;

         height= width;

         dst_left= 0;

         dst_top= 0;

         dst_right= width;

         dst_bottom= width;

      }else{

         roundPx= height / 2;

         float clip = (width - height)/ 2;

         left= clip;

         right= width - clip;

         top= 0;

         bottom= height;

         width= height;

         dst_left= 0;

         dst_top= 0;

         dst_right= height;

         dst_bottom= height;

      }

 

      Bitmapoutput = Bitmap.createBitmap(width, height, Config.ARGB_8888);

      Canvascanvas = newCanvas(output);

 

      finalint color = 0xff424242;

      final Paint paint = new Paint();

      final Rect src = new Rect((int) left, (int) top, (int) right,

            (int) bottom);

      final Rect dst = new Rect((int) dst_left, (int) dst_top,

            (int) dst_right, (int) dst_bottom);

      final RectF rectF = new RectF(dst);

 

      paint.setAntiAlias(true);

 

      canvas.drawARGB(0,0, 0, 0);

      paint.setColor(color);

      canvas.drawRoundRect(rectF,roundPx, roundPx, paint);

 

      paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));

      canvas.drawBitmap(bitmap,src, dst, paint);

      return output;

   }

 

//高斯模糊处理图片

* @param sentBitmap

    *           :要模糊的图片

    * @param radius

    *           :模糊度

    * @return

publicstaticBitmap createBlurBitmap(Bitmap sentBitmap, int radius) {

      Bitmapbitmap = sentBitmap.copy(sentBitmap.getConfig(), true);

      if (radius < 1) {

         return (null);

      }

      int w = bitmap.getWidth();

      int h = bitmap.getHeight();

      int[] pix = newint[w * h];

      bitmap.getPixels(pix,0, w, 0, 0, w, h);

      int wm = w - 1;

      int hm = h - 1;

      int wh = w * h;

      int div = radius + radius +1;

      int r[] = newint[wh];

      int g[] = newint[wh];

      int b[] = newint[wh];

      int rsum, gsum, bsum, x, y,i, p, yp, yi, yw;

      int vmin[] = newint[Math.max(w, h)];

      int divsum = (div + 1)>> 1;

      divsum*= divsum;

      int dv[] = newint[256 * divsum];

      for (i = 0; i < 256 *divsum; i++) {

         dv[i]= (i / divsum);

      }

      yw= yi = 0;

      int[][] stack = newint[div][3];

      int stackpointer;

      int stackstart;

      int[] sir;

      int rbs;

      int r1 = radius + 1;

      int routsum, goutsum,boutsum;

      int rinsum, ginsum, binsum;

      for (y = 0; y < h; y++){

         rinsum= ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;

         for (i = -radius; i <=radius; i++) {

            p= pix[yi + Math.min(wm, Math.max(i, 0))];

            sir= stack[i + radius];

            sir[0]= (p & 0xff0000) >> 16;

            sir[1]= (p & 0x00ff00) >> 8;

            sir[2]= (p & 0x0000ff);

            rbs= r1 - Math.abs(i);

            rsum+= sir[0] * rbs;

            gsum+= sir[1] * rbs;

            bsum+= sir[2] * rbs;

            if (i > 0) {

                rinsum+= sir[0];

                ginsum+= sir[1];

                binsum+= sir[2];

            }else{

                routsum+= sir[0];

                goutsum+= sir[1];

                boutsum+= sir[2];

            }

         }

         stackpointer= radius;

         for (x = 0; x < w; x++){

            r[yi]= dv[rsum];

            g[yi]= dv[gsum];

            b[yi]= dv[bsum];

            rsum-= routsum;

            gsum-= goutsum;

            bsum-= boutsum;

            stackstart= stackpointer - radius + div;

            sir= stack[stackstart % div];

            routsum-= sir[0];

            goutsum-= sir[1];

            boutsum-= sir[2];

            if (y == 0) {

                vmin[x]= Math.min(x + radius + 1, wm);

            }

            p= pix[yw + vmin[x]];

            sir[0]= (p & 0xff0000) >> 16;

            sir[1]= (p & 0x00ff00) >> 8;

            sir[2]= (p & 0x0000ff);

            rinsum+= sir[0];

            ginsum+= sir[1];

            binsum+= sir[2];

            rsum+= rinsum;

            gsum+= ginsum;

            bsum+= binsum;

            stackpointer= (stackpointer + 1) % div;

            sir= stack[(stackpointer) % div];

            routsum+= sir[0];

            goutsum+= sir[1];

            boutsum+= sir[2];

            rinsum-= sir[0];

            ginsum-= sir[1];

            binsum-= sir[2];

            yi++;

         }

         yw+= w;

      }

      for (x = 0; x < w; x++){

         rinsum= ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;

         yp= -radius * w;

         for (i = -radius; i <=radius; i++) {

            yi= Math.max(0, yp) + x;

            sir= stack[i + radius];

            sir[0]= r[yi];

            sir[1]= g[yi];

            sir[2]= b[yi];

            rbs= r1 - Math.abs(i);

            rsum+= r[yi] * rbs;

            gsum+= g[yi] * rbs;

            bsum+= b[yi] * rbs;

            if (i > 0) {

                rinsum+= sir[0];

                ginsum+= sir[1];

                binsum+= sir[2];

            }else{

                routsum+= sir[0];

                goutsum+= sir[1];

                boutsum+= sir[2];

            }

            if (i < hm) {

                yp+= w;

            }

         }

         yi= x;

         stackpointer= radius;

         for (y = 0; y < h; y++){

            pix[yi]= (0xff000000 & pix[yi]) | (dv[rsum] << 16)

                   |(dv[gsum] << 8) | dv[bsum];

            rsum-= routsum;

            gsum-= goutsum;

            bsum-= boutsum;

            stackstart= stackpointer - radius + div;

            sir= stack[stackstart % div];

            routsum-= sir[0];

            goutsum-= sir[1];

            boutsum-= sir[2];

            if (x == 0) {

                vmin[y]= Math.min(y + r1, hm) * w;

            }

            p= x + vmin[y];

            sir[0]= r[p];

            sir[1]= g[p];

            sir[2]= b[p];

            rinsum+= sir[0];

            ginsum+= sir[1];

            binsum+= sir[2];

            rsum+= rinsum;

            gsum+= ginsum;

            bsum+= binsum;

            stackpointer= (stackpointer + 1) % div;

            sir= stack[stackpointer];

            routsum+= sir[0];

            goutsum+= sir[1];

            boutsum+= sir[2];

            rinsum-= sir[0];

            ginsum-= sir[1];

            binsum-= sir[2];

            yi+= w;

         }

      }

      bitmap.setPixels(pix,0, w, 0, 0, w, h);

      return (bitmap);

   }

 

                             

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值