Bitmap对象的几种获取方法
2014-06-18 15:41
1016 查看
Bitmap对象的获取有很多种方法,但是不同的文件使用的方法也不同,如:资源文件是在本地资源文件还是sd中的文件,抑或是ImageView中的
资源文件,下面我们就来讲解一下各种情况下Bitmap对象的获取方法。
一:从资源文件中获取Bitmap对象。
从资源文件中获取Bitmap对象,我们应该很快明白资源文件能够转发为一个Drawable对象,所以围绕Drawable再去进行转换就不会错。下面是
几种转化的方法。
二:将sd中的文件转化成Bitmap对象。
将SD卡中的文件转化成Bitmap对象,我们应该明白,无论如何必须将SD卡中的文件先读到内存中,然后再去进行转化,所以这里就一定关联了
文件输入流,这样去想思路就会清晰很多。
三、将View对象或者布局文件转化成Bitmap对象。
有时候我们需要将一个布局文件转化成一张图片,那么就得首先获取这个布局的Bitmap对象,在转化之前我们很容易想到得先将这个布局转化成一个
View对象,然后再进行转化。
有时候我们需要获取一个ImageView中的图片资源,这里有两个思路,一个是由于ImageView也是一个View故可以和上述一样的方法,另外则可以获取
ImageView的Drawable对象,然后再获取Bitmap对象。
四、将byte[]数组转化成Bitmap对象
五、将Bitmap转化成byte[]数组
六、添加水印
七、旋转图片,并保存
暂时就介绍这么多吧,从上面的介绍其实我们就能够引申出其他使用方法,如:自定义水印,等。
资源文件,下面我们就来讲解一下各种情况下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(); } }
暂时就介绍这么多吧,从上面的介绍其实我们就能够引申出其他使用方法,如:自定义水印,等。
相关文章推荐
- 获取类的class对象的几种方法
- (转)获取/设置IFRAME内对象元素的几种JS方法
- Unity3d获取游戏对象的几种方法
- 获取/设置IFRAME内对象元素的几种JS方法
- Unity3d获取游戏对象的几种方法
- 获取对象类型及类型判断的几种方法
- Android 从ImageView中获取Bitmap对象方法
- 获取/设置IFRAME内对象元素的几种JS方法
- java中获取Class对象的几种方法
- Unity3d获取游戏对象的几种方法
- 百度 地图 slidingmenu 黑边 使用截图的方式解决黑边问题,步骤: 1.slidingMenu打开的时候调用BaiduMap的snapshot方法截图获取Bitmap对象; 2.使用
- highcharts 获取图表对象的几种方法
- android 用JSON去服务器获取JSON对象 和其他的几种方法去服务器获取JSON对象
- 快速获取/设置iframe内对象元素的几种js实现方法
- Unity3d获取游戏对象的几种方法
- Unity3d获取游戏对象的几种方法
- 【转】获取/设置IFRAME内对象元素的几种JS方法
- java获取Class对象的几种方法
- JS获取/设置iframe内对象元素、文档的几种方法
- 获取/设置IFRAME内对象元素的几种JS方法