【概】目的使用bitmap截取屏幕上部分内容,顺利入坑:y+height must <=source height
【注】开始还没明白意思,log出y始终<bitmap.getHeight();
百度了以下才明了:
//源码
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height) {
throw new RuntimeException("Stub!");
}
//y就是中间的参数y,height为参数height,必须满足:y+height<=bitmap.getHeight();bitmap为传入的bitmap
【最终目的】从屏幕整张图片中截取出指定区域
private void getBitmap() throws Exception {
View screenView = getWindow().getDecorView();
screenView.setDrawingCacheEnabled(true);
screenView.buildDrawingCache();
//获取屏幕整张图片
Bitmap bitmap = screenView.getDrawingCache();
if (bitmap != null&&srcName!=null) {
optionBox.setVisibility(View.GONE);
//获取需要截图部分的在屏幕上的坐标(view的左上角坐标)
int[] viewLocationArray = new int[2];
view.getLocationOnScreen(viewLocationArray);
//需要截取的长和宽
int outWidth = screenView.getWidth();
int outHeight = view.getHeight();
if(viewLocationArray[1]+outHeight>bitmap.getHeight()&&viewLocationArray[1]+outHeight!=bitmap.getHeight()){
outHeight=outHeight-(viewLocationArray[1]+outHeight-bitmap.getHeight());
//Log.e("messIT","超出高度!outheight="+outHeight+",bitmapHeight="+bitmap.getHeight());
}
if(viewLocationArray[0]+outWidth>bitmap.getWidth()){
outWidth=bitmap.getWidth()-viewLocationArray[0];
}
//从屏幕整张图片中截取指定区域
//Log.e("messIT","bitmapHeight="+bitmap.getHeight()+"bitmapWidth="+bitmap.getWidth()+"--"+viewLocationArray[0]+","+viewLocationArray[1]+";"+outWidth+","+outHeight);
bitmap = Bitmap.createBitmap(bitmap, viewLocationArray[0], viewLocationArray[1], outWidth, outHeight);
File mFile=uriToFile(Uri.parse(srcName),this);
FileOutputStream outputStream = new FileOutputStream(mFile); //构建输出流
bitmap.compress(Bitmap.CompressFormat.JPEG, 30, outputStream); //compress到输出outputStream
Toast.makeText(getApplicationContext(),"保存成功!",Toast.LENGTH_SHORT).show();
Intent intent=new Intent();
intent.putExtra("imgSrc",srcName);
intent.putExtra("id",id);
setResult(0001,intent);
finish();
}
}