您的位置:首页 > 其它

Bitmap对象的几种获取方法

2014-06-18 15:41 1016 查看
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();
}
}

暂时就介绍这么多吧,从上面的介绍其实我们就能够引申出其他使用方法,如:自定义水印,等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: