Bitmap对象的几种获取方法

Bitmap对象的获取有很多种方法,但是不同的文件使用的方法也不同,如:资源文件是在本地资源文件还是sd中的文件,抑或是ImageView中的

资源文件,下面我们就来讲解一下各种情况下Bitmap对象的获取方法。

一:从资源文件中获取Bitmap对象。

从资源文件中获取Bitmap对象,我们应该很快明白资源文件能够转发为一个Drawable对象,所以围绕Drawable再去进行转换就不会错。下面是

几种转化的方法。

    /**
     * 将资源文件转换成Drawabled对象然后再进行转换*/
    public Bitmap getBitmap1(){
    	Drawable db = getResources().getDrawable(R.drawable.logo_picc);
		BitmapDrawable drawable = (BitmapDrawable)db;
		
		Bitmap bitmap = drawable.getBitmap();	
		return bitmap;	
	}
    
    /**
     * 直接使用BitmapFactory进行转换*/
    public Bitmap getBitmap2(){
    	Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo_picc);
    	return bitmap;
    }
    
    /**
     * 使用Canvas进行转换*/
    public Bitmap getBitmap3(){
    	Drawable db = getResources().getDrawable(R.drawable.logo_picc);
    	Bitmap bitmap = Bitmap.createBitmap(db.getIntrinsicWidth(), db.getIntrinsicHeight(), 
    			Config.ARGB_8888);
    	Canvas canvas = new Canvas(bitmap);   	
    		
    	db.setBounds(0, 0, db.getIntrinsicWidth(), db.getIntrinsicHeight());   	
    	db.draw(canvas);
    	
    	return bitmap;
    }

二:将sd中的文件转化成Bitmap对象。

将SD卡中的文件转化成Bitmap对象,我们应该明白,无论如何必须将SD卡中的文件先读到内存中,然后再去进行转化,所以这里就一定关联了

文件输入流,这样去想思路就会清晰很多。

    /**
     * 先获取输入流,然后decode*/
    public Bitmap getBitmp1(String path){ 
    	Bitmap bitmap =null;
		try {
			File file = new File(path);
			if(file.isFile()){
				InputStream input = new FileInputStream(file);
				BitmapFactory.Options  opt = new BitmapFactory.Options();   
				opt.inPreferredConfig = Bitmap.Config.RGB_565;
				opt.inPurgeable = true;
				opt.inInputShareable = true;
				opt.inSampleSize = 5;//这个是同比例缩放,5就表示同比例缩小一倍。图片文件太大如果不进行设置就会导致OOM错误
				bitmap = BitmapFactory.decodeStream(input, null, opt);
			}	
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return bitmap;
    }
    
    /**
     * 直接使用BitmapFactory的decodeFile方法*/
    public Bitmap getBitmap2(String path){
    	BitmapFactory.Options  opt = new BitmapFactory.Options();   
		opt.inPreferredConfig = Bitmap.Config.RGB_565;
		opt.inPurgeable = true;
		opt.inInputShareable = true;
		opt.inSampleSize = 5;//这个是同比例缩放,5就表示同比例缩小一倍。图片文件太大如果不进行设置就会导致OOM错误
    	Bitmap bitmap = BitmapFactory.decodeFile(path, opt);
    	
    	return bitmap;
    }

三、将View对象或者布局文件转化成Bitmap对象。

有时候我们需要将一个布局文件转化成一张图片,那么就得首先获取这个布局的Bitmap对象,在转化之前我们很容易想到得先将这个布局转化成一个

View对象,然后再进行转化。

    public Bitmap getBitmp1(){
    	LayoutInflater factory = LayoutInflater.from(MainActivity.this);   	
   	 	View view = factory.inflate(R.layout.imageflag, null);
   	 	
   	 	TextView time = (TextView)view.findViewById(R.id.time);
	 	TextView jobnumber = (TextView)view.findViewById(R.id.jobnumber);
   	 	
   	 	time.setText(getTime());
   	 	jobnumber.setText("E/N:00000000");       	 	      	 	
       	
    	//启用绘图缓存
        view.setDrawingCacheEnabled(false);        
        //调用下面这个方法非常重要,如果没有调用这个方法,得到的bitmap为null   
        view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),  
        		MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
        //这个方法也非常重要,设置布局的尺寸和位置  
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        //获得绘图缓存中的Bitmap
        view.buildDrawingCache();
    	Bitmap map = view.getDrawingCache();
    	return map;
    }

有时候我们需要获取一个ImageView中的图片资源,这里有两个思路,一个是由于ImageView也是一个View故可以和上述一样的方法,另外则可以获取

ImageView的Drawable对象,然后再获取Bitmap对象。

    public Bitmap getBitmap2(ImageView image){
    	//由于ImageView也是一个View对象所以和上述方法类似。
    	/*//启用绘图缓存
    	image.setDrawingCacheEnabled(false);        
        //调用下面这个方法非常重要,如果没有调用这个方法,得到的bitmap为null   
    	image.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),  
        		MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
        //这个方法也非常重要,设置布局的尺寸和位置  
    	image.layout(0, 0, image.getMeasuredWidth(), image.getMeasuredHeight());
        //获得绘图缓存中的Bitmap
    	image.buildDrawingCache();        
    	Bitmap bitmap = image.getDrawingCache();*/
    	
    	//获取ImageView的Drawable对象,然后再获取Bitmap对象
    	Drawable db = image.getDrawable();
    	BitmapDrawable bd = (BitmapDrawable)db;
    	Bitmap bitmap = bd.getBitmap();
    	return bitmap;
    }

四、将byte[]数组转化成Bitmap对象

    public Bitmap getBitmp1(byte[]array){
    	Bitmap bitmap = BitmapFactory.decodeByteArray(array, 0, array.length);
    	return bitmap;
    }

五、将Bitmap转化成byte[]数组

    public byte[] getBitmp1(Bitmap bitmap){
    	ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    	bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
    	
    	return baos.toByteArray();
    }

六、添加水印

    public Bitmap watermarkBitmap(Bitmap src, Bitmap watermark) {
        if (src == null) {
            return null;
        }
        int w = (int)(src.getWidth());
        int h = (int)(src.getHeight());       
        Bitmap newb= Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图      
        
        Paint paint=new Paint();
        paint.setDither(true);
        Canvas cv = new Canvas(newb);              
        cv.drawBitmap(src, 0, 0, paint);// 在 0,0坐标开始画入src
                       
        //加入水印
        if (watermark != null) {
            int ww = watermark.getWidth();
            int wh = watermark.getHeight();
            paint.setAlpha(50);//这个是水印的模糊处理
            cv.drawBitmap(watermark, w - ww -15, h - wh -15, paint);// 在src的右下角画入水印            
        }
        cv.save(Canvas.ALL_SAVE_FLAG);// 保存
        cv.restore();// 存储
        src.recycle();
        watermark.recycle();        
        
        return newb;
    }

七、旋转图片,并保存

    /**
     * 旋转图片,获取要旋转图片的bitmap对象,旋转后保存图片*/
    public void Rotate(Bitmap bitmap){
    	
    	Matrix m = new Matrix();
        m.setRotate(90);//旋转角度
        Bitmap transformed = Bitmap.createBitmap(bitmap, 0, 0, (int)(bitmap.getWidth()), 
        		(int)(bitmap.getHeight()), m, true);
		try {
		    File file = new File("image.jpg");
			OutputStream out = new FileOutputStream(file);
			transformed.compress(CompressFormat.JPEG, 100, out);
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    }

暂时就介绍这么多吧,从上面的介绍其实我们就能够引申出其他使用方法,如:自定义水印,等。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值