Android:Bitmap应用收集

      BitMap代表一张位图,扩展名可以是.bmp或者.dib。位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/8=3072KB
位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,不利于在网络上传送。jpg格式则恰好弥补了位图文件这个缺点。
在android系统当中,bitmap是图像处理最重要的类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。

一、Bitmap的生成

1.1 BitmapFactory decode出Bitmap

    Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。

Android图像处理之Bitmap类

图一、BitmapFactory主要方法及Options选项

 

利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap。
从资源文件中获取:
Bitmap rawBitmap = BitmapFactory.decodeResource(getResource(),R.drawable.image1);
从SD卡中得到图片:
String SDCardPath = Environment.getExtermalStoreageDirectory().toString();
String filePath = SDCardPath + "/" + "image1.jpg";
Bitmap rawBitmap = BitmapFactory.decodeFile(filePath,null);
=====================
InputStream inputSteam = getBitmapInputStreamFromSDCard("image1.jpg);
Bitmap rawBitmap = BitmapFactory.decodeStream(inputSteam);
将Bitmap和Drawable相互转换
Drawable newBitmapDrawable = new BitmapDrawable(Bitmap);
===
// 如果要获取BitMapDrawable中所包装的BitMap对象,可以用getBitMap()方法;
Bitmap bitmap = newBitmapDrawable.getBitmap();

回收Bitmap所占用的内存:
if(!bitmap.isRecycled())
    bitmap.recycle();

在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options

利用Options的下列属性,可以指定decode的选项:

  • inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。
  • inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
  • inSampleSize 设置decode时的缩放比例。

二、利用Bitmap和Matrix实现图像变换

    Bitmap可以和Matrix结合实现图像的剪切、旋转、缩放等操作。

Android图像处理之Bitmap类

图三、Bitmap方法

 

用源Bitmap通过变换生成新的Bitmap的方法:

    public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height,  
                Matrix m, boolean filter)  
    public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height)  
    public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,  
                int dstHeight,boolean filter)  

第一个方法是最终的实现,后两种只是对第一种方法的封装。

第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现 剪切;第三个方法可以把源Bitmap 缩放为dstWidth x dstHeight的Bitmap。

设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。

Android图像处理之Bitmap类

图四、Bitmap实现旋转
=========== 将图片高宽和的大小kB压缩
public static Bitmap zoomImg(Bitmap bm, int newWidth ,int newHeight){   

    // 获得图片的原始宽高   
    int width = bm.getWidth();   
    int height = bm.getHeight();   
    // 计算缩放比例   因子
    float scaleWidth = ((float) newWidth) / width;   
    float scaleHeight = ((float) newHeight) / height;   
    // 新建立矩阵
    Matrix matrix = new Matrix();   
    matrix.postScale(scaleWidth, scaleHeight);   
    //matrix.postRotate(-30);
//matrix.psotSkey(0.1f,0.1f);
  //  压缩后图片的宽和高以及kB大小均会变化
    Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);   
    return newbm;   
}  
============设置图片的圆角,返回设置后的BitMap
public Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
        Bitmap roundCornerBitmap = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(roundCornerBitmap);
        int color = 0xff424242;
        Paint paint = new Paint();
        paint.setColor(color);
        // 防止锯齿
        paint.setAntiAlias(true);
        Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        RectF rectF = new RectF(rect);
        float roundPx = pixels;
        // 相当于清屏
        canvas.drawARGB(0, 0, 0, 0);
        // 先画了一个带圆角的矩形
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        // 再把原来的bitmap画到现在的bitmap!!!注意这个理解
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return roundCornerBitmap;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值