Android绘制进阶之五:位图的处理
16lz
2021-01-24
图片的处理包括以下:
1, 缩放
2, 倾斜
3, 旋转
4, 缩放+
5, 平移
6, 镜像
代码如下:
- packagecom.mike.activity;
- importjava.io.FileNotFoundException;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.graphics.BitmapFactory.Options;
- importandroid.graphics.Canvas;
- importandroid.graphics.Color;
- importandroid.graphics.Matrix;
- importandroid.graphics.Paint;
- importandroid.net.Uri;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.Display;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.ImageView;
- publicclassImageDemoActivityextendsActivityimplementsOnClickListener{
- /**Calledwhentheactivityisfirstcreated.*/
- publicstaticStringTAG="IMAGE";
- publicstaticintREQUEST_CODE=0;
- privateImageViewmImageShow;
- privateImageViewmImageAltered;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ButtonimageSelectBtn=(Button)findViewById(R.id.imageSelectBtn);
- mImageShow=(ImageView)findViewById(R.id.imageShow);
- mImageAltered=(ImageView)findViewById(R.id.imageAltered);
- imageSelectBtn.setOnClickListener(this);
- }
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- Intentintent=newIntent(Intent.ACTION_PICK,
- android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//启动照片Gallery
- startActivityForResult(intent,0);
- }
- @Override
- protectedvoidonActivityResult(intrequestCode,intresultCode,
- Intentintent){
- //TODOAuto-generatedmethodstub
- super.onActivityResult(requestCode,resultCode,intent);
- if(resultCode==RESULT_OK){//操作成功
- UriimgFileUri=intent.getData();//获得所选照片的信息
- Log.d(TAG,"imgFileUriis:"+imgFileUri);
- //由于返回的图像可能太大而无法完全加载到内存中。系统有限制,需要处理。
- DisplaycurrentDisplay=getWindowManager().getDefaultDisplay();
- intdefaultHeight=currentDisplay.getHeight();
- intdefaultWidth=currentDisplay.getWidth();
- BitmapFactory.OptionsbitmapFactoryOptions=newBitmapFactory.Options();
- bitmapFactoryOptions.inJustDecodeBounds=false;///只是为获取原始图片的尺寸,而不返回Bitmap对象
- //注上:Ifsettotrue,thedecoderwillreturnnull(nobitmap),but
- //theout...fieldswillstillbeset,
- //allowingthecallertoquerythebitmapwithouthavingto
- //allocatethememoryforitspixels
- try{
- Bitmapbitmap=BitmapFactory.decodeStream(getContentResolver()
- .openInputStream(imgFileUri),null,
- bitmapFactoryOptions);
- intoutHeight=bitmapFactoryOptions.outHeight;
- intoutWidth=bitmapFactoryOptions.outWidth;
- intheightRatio=(int)Math.ceil((float)outHeight
- /defaultHeight);
- intwidthRatio=(int)Math.ceil((float)outWidth
- /defaultWidth);
- if(heightRatio>1||widthRatio>1){
- if(heightRatio>widthRatio){
- bitmapFactoryOptions.inSampleSize=heightRatio;
- }else{
- bitmapFactoryOptions.inSampleSize=widthRatio;
- }
- }
- bitmapFactoryOptions.inJustDecodeBounds=false;
- bitmap=BitmapFactory.decodeStream(getContentResolver()
- .openInputStream(imgFileUri),null,
- bitmapFactoryOptions);
- mImageShow.setImageBitmap(bitmap);
- ///*
- //*在位图上绘制位图
- //*/
- //
- //BitmapbitmapAltered=Bitmap.createBitmap(bitmap.getWidth(),
- //bitmap.getHeight(),bitmap.getConfig());
- //
- //Canvascanvas=new
- //Canvas(bitmapAltered);//bitmap提供了画布,只在此提供了大小尺寸,偏移后并未有背景显示出来
- //
- //
- //Paintpaint=newPaint();
- //
- //canvas.drawBitmap(bitmap,0,0,paint);//绘制的图片和之前的一模一样
- //
- //mImageAltered.setImageBitmap(bitmapAltered);
- /*
- *使用矩阵
- */
- BitmapbitmapAltered=Bitmap.createBitmap(bitmap.getWidth(),
- bitmap.getHeight(),bitmap.getConfig());//缺点是限定画布大小,处理后的图片可能被截断,可引入矩阵构造方法,动态设定画布大小
- Canvascanvas=newCanvas(bitmapAltered);//bitmap提供了画布,只在此提供了大小尺寸,偏移后并未有背景显示出来,
- Paintpaint=newPaint();
- Matrixmatrix=newMatrix();
- //1:缩放
- //matrix.setValues(newfloat[]{//涉及线性代数的知识,可以翻翻相乘的基础知识
- //1,0,0,//算出x的值
- //0,1,0,//算出y的值
- //0,0,1//二维图用不到
- //});
- //2:倾斜
- //matrix.setValues(newfloat[]{//涉及线性代数的知识,可以翻翻相乘的基础知识
- //1,.5f,0,//算出x的值,x,y值相关
- //0,1,0,//算出y的值
- //0,0,1//二维图用不到
- //});
- //3:旋转
- //matrix.setRotate(45);//设置旋转角度,(0,0)点,顺时针旋转45度
- //4,缩放plus:使用Matrix类方法//需要修改画布宽度>1.5倍*原始宽度
- //matrix.setScale(1.5f,1);
- //5,平移
- //matrix.setTranslate(10,0);
- //6,镜像
- //eg1:x轴镜像
- //matrix.setScale(-1,1);//向左绘制,原始图片沿y轴对称
- //matrix.postTranslate(bitmap.getWidth(),0);//注意是post即后移动
- //eg2:y轴镜像
- matrix.setScale(1,-1);//向上绘制,原始图片沿x轴对称,图像在第四象限
- matrix.postTranslate(0,bitmap.getHeight());//注意是post即后移动
- //~optimize~因为指定画布大小bitmapAltered,所以处理后的图片可能被截断,可以通过矩阵动态改变bitmapAltered大小
- //eg:matrix.setRotate(degrees,px,py)
- //bitmapAltered=Bitmap.createBitmap(source,x,y,width,height,m,filter);//显然矩阵影响其大小
- //
- //注:formoredetails:WikipediaTransformationMatrix
- //http://en.wikipedia.org/wiki/Transformation_matrix
- canvas.drawBitmap(bitmap,matrix,paint);//绘制的图片和之前的一模一样
- mImageAltered.setImageBitmap(bitmapAltered);
- }catch(FileNotFoundExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }
- }
更多相关文章
- [掌眼]Android(安卓)WebView Long Press长按保存图片到手机
- android技术选型(持续更新中...)
- android webview pre[name=code] syntaxHighlighter 代码高亮
- Android(安卓)Bitmap相关
- [Android] 调用系统裁切图片的 !!! FAILED BINDER TRANSACTION !
- android 广告栏 viewpager
- android4.4 安装微信7.0.6版本底部显示黑色的问题
- android两种方式中自己画一个圆,实现单点触控时拖动图片,跟着拖动
- Android(安卓)drawable shape绘制边框