图片的处理包括以下:

1, 缩放

2, 倾斜

3, 旋转

4, 缩放+

5, 平移

6, 镜像

代码如下:

        
  1. packagecom.mike.activity;
  2. importjava.io.FileNotFoundException;
  3. importandroid.app.Activity;
  4. importandroid.content.Intent;
  5. importandroid.graphics.Bitmap;
  6. importandroid.graphics.BitmapFactory;
  7. importandroid.graphics.BitmapFactory.Options;
  8. importandroid.graphics.Canvas;
  9. importandroid.graphics.Color;
  10. importandroid.graphics.Matrix;
  11. importandroid.graphics.Paint;
  12. importandroid.net.Uri;
  13. importandroid.os.Bundle;
  14. importandroid.util.Log;
  15. importandroid.view.Display;
  16. importandroid.view.View;
  17. importandroid.view.View.OnClickListener;
  18. importandroid.widget.Button;
  19. importandroid.widget.ImageView;
  20. publicclassImageDemoActivityextendsActivityimplementsOnClickListener{
  21. /**Calledwhentheactivityisfirstcreated.*/
  22. publicstaticStringTAG="IMAGE";
  23. publicstaticintREQUEST_CODE=0;
  24. privateImageViewmImageShow;
  25. privateImageViewmImageAltered;
  26. @Override
  27. publicvoidonCreate(BundlesavedInstanceState){
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.main);
  30. ButtonimageSelectBtn=(Button)findViewById(R.id.imageSelectBtn);
  31. mImageShow=(ImageView)findViewById(R.id.imageShow);
  32. mImageAltered=(ImageView)findViewById(R.id.imageAltered);
  33. imageSelectBtn.setOnClickListener(this);
  34. }
  35. publicvoidonClick(Viewv){
  36. //TODOAuto-generatedmethodstub
  37. Intentintent=newIntent(Intent.ACTION_PICK,
  38. android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//启动照片Gallery
  39. startActivityForResult(intent,0);
  40. }
  41. @Override
  42. protectedvoidonActivityResult(intrequestCode,intresultCode,
  43. Intentintent){
  44. //TODOAuto-generatedmethodstub
  45. super.onActivityResult(requestCode,resultCode,intent);
  46. if(resultCode==RESULT_OK){//操作成功
  47. UriimgFileUri=intent.getData();//获得所选照片的信息
  48. Log.d(TAG,"imgFileUriis:"+imgFileUri);
  49. //由于返回的图像可能太大而无法完全加载到内存中。系统有限制,需要处理。
  50. DisplaycurrentDisplay=getWindowManager().getDefaultDisplay();
  51. intdefaultHeight=currentDisplay.getHeight();
  52. intdefaultWidth=currentDisplay.getWidth();
  53. BitmapFactory.OptionsbitmapFactoryOptions=newBitmapFactory.Options();
  54. bitmapFactoryOptions.inJustDecodeBounds=false;///只是为获取原始图片的尺寸,而不返回Bitmap对象
  55. //注上:Ifsettotrue,thedecoderwillreturnnull(nobitmap),but
  56. //theout...fieldswillstillbeset,
  57. //allowingthecallertoquerythebitmapwithouthavingto
  58. //allocatethememoryforitspixels
  59. try{
  60. Bitmapbitmap=BitmapFactory.decodeStream(getContentResolver()
  61. .openInputStream(imgFileUri),null,
  62. bitmapFactoryOptions);
  63. intoutHeight=bitmapFactoryOptions.outHeight;
  64. intoutWidth=bitmapFactoryOptions.outWidth;
  65. intheightRatio=(int)Math.ceil((float)outHeight
  66. /defaultHeight);
  67. intwidthRatio=(int)Math.ceil((float)outWidth
  68. /defaultWidth);
  69. if(heightRatio>1||widthRatio>1){
  70. if(heightRatio>widthRatio){
  71. bitmapFactoryOptions.inSampleSize=heightRatio;
  72. }else{
  73. bitmapFactoryOptions.inSampleSize=widthRatio;
  74. }
  75. }
  76. bitmapFactoryOptions.inJustDecodeBounds=false;
  77. bitmap=BitmapFactory.decodeStream(getContentResolver()
  78. .openInputStream(imgFileUri),null,
  79. bitmapFactoryOptions);
  80. mImageShow.setImageBitmap(bitmap);
  81. ///*
  82. //*在位图上绘制位图
  83. //*/
  84. //
  85. //BitmapbitmapAltered=Bitmap.createBitmap(bitmap.getWidth(),
  86. //bitmap.getHeight(),bitmap.getConfig());
  87. //
  88. //Canvascanvas=new
  89. //Canvas(bitmapAltered);//bitmap提供了画布,只在此提供了大小尺寸,偏移后并未有背景显示出来
  90. //
  91. //
  92. //Paintpaint=newPaint();
  93. //
  94. //canvas.drawBitmap(bitmap,0,0,paint);//绘制的图片和之前的一模一样
  95. //
  96. //mImageAltered.setImageBitmap(bitmapAltered);
  97. /*
  98. *使用矩阵
  99. */
  100. BitmapbitmapAltered=Bitmap.createBitmap(bitmap.getWidth(),
  101. bitmap.getHeight(),bitmap.getConfig());//缺点是限定画布大小,处理后的图片可能被截断,可引入矩阵构造方法,动态设定画布大小
  102. Canvascanvas=newCanvas(bitmapAltered);//bitmap提供了画布,只在此提供了大小尺寸,偏移后并未有背景显示出来,
  103. Paintpaint=newPaint();
  104. Matrixmatrix=newMatrix();
  105. //1:缩放
  106. //matrix.setValues(newfloat[]{//涉及线性代数的知识,可以翻翻相乘的基础知识
  107. //1,0,0,//算出x的值
  108. //0,1,0,//算出y的值
  109. //0,0,1//二维图用不到
  110. //});
  111. //2:倾斜
  112. //matrix.setValues(newfloat[]{//涉及线性代数的知识,可以翻翻相乘的基础知识
  113. //1,.5f,0,//算出x的值,x,y值相关
  114. //0,1,0,//算出y的值
  115. //0,0,1//二维图用不到
  116. //});
  117. //3:旋转
  118. //matrix.setRotate(45);//设置旋转角度,(0,0)点,顺时针旋转45度
  119. //4,缩放plus:使用Matrix类方法//需要修改画布宽度>1.5倍*原始宽度
  120. //matrix.setScale(1.5f,1);
  121. //5,平移
  122. //matrix.setTranslate(10,0);
  123. //6,镜像
  124. //eg1:x轴镜像
  125. //matrix.setScale(-1,1);//向左绘制,原始图片沿y轴对称
  126. //matrix.postTranslate(bitmap.getWidth(),0);//注意是post即后移动
  127. //eg2:y轴镜像
  128. matrix.setScale(1,-1);//向上绘制,原始图片沿x轴对称,图像在第四象限
  129. matrix.postTranslate(0,bitmap.getHeight());//注意是post即后移动
  130. //~optimize~因为指定画布大小bitmapAltered,所以处理后的图片可能被截断,可以通过矩阵动态改变bitmapAltered大小
  131. //eg:matrix.setRotate(degrees,px,py)
  132. //bitmapAltered=Bitmap.createBitmap(source,x,y,width,height,m,filter);//显然矩阵影响其大小
  133. //
  134. //注:formoredetails:WikipediaTransformationMatrix
  135. //http://en.wikipedia.org/wiki/Transformation_matrix
  136. canvas.drawBitmap(bitmap,matrix,paint);//绘制的图片和之前的一模一样
  137. mImageAltered.setImageBitmap(bitmapAltered);
  138. }catch(FileNotFoundExceptione){
  139. //TODOAuto-generatedcatchblock
  140. e.printStackTrace();
  141. }
  142. }
  143. }
  144. }

更多相关文章

  1. [掌眼]Android(安卓)WebView Long Press长按保存图片到手机
  2. android技术选型(持续更新中...)
  3. android webview pre[name=code] syntaxHighlighter 代码高亮
  4. Android(安卓)Bitmap相关
  5. [Android] 调用系统裁切图片的 !!! FAILED BINDER TRANSACTION !
  6. android 广告栏 viewpager
  7. android4.4 安装微信7.0.6版本底部显示黑色的问题
  8. android两种方式中自己画一个圆,实现单点触控时拖动图片,跟着拖动
  9. Android(安卓)drawable shape绘制边框

随机推荐

  1. Android(安卓)调用相册 拍照 实现系统控
  2. 【攻克Android(安卓)(13)】Menu 菜单
  3. Android(安卓)PDF开发:android-pdfview
  4. Android(安卓)保存文件路径方法
  5. Android(安卓)国际化问题
  6. Android(安卓)Studio 官方最新版下载地址
  7. android pppd拨号问题及解决办法
  8. Android(安卓)抢购类倒计时实现 (包括天数
  9. 【Android】EventBus源码解析(3.1.1)
  10. Android多平台推送