Android绘制进阶之五:位图的处理
2973 点击·0 回帖
![]() | ![]() | |
![]() | 图片的处理包括以下: 1, 缩放 2, 倾斜 3, 旋转 4, 缩放+ 5, 平移 6, 镜像 代码如下: 1. package com.mike.activity; 2. 3. import java.io.FileNotFoundException; 4. 5. import Android.app.Activity; 6. import Android.content.Intent; 7. import Android.graphics.Bitmap; 8. import Android.graphics.BitmapFactory; 9. import Android.graphics.BitmapFactory.Options; 10. import Android.graphics.Canvas; 11. import Android.graphics.Color; 12. import Android.graphics.Matrix; 13. import Android.graphics.Paint; 14. import Android.net.Uri; 15. import Android.os.Bundle; 16. import Android.util.Log; 17. import Android.view.Display; 18. import Android.view.View; 19. import Android.view.View.OnClickListener; 20. import Android.widget.Button; 21. import Android.widget.ImageView; 22. 23. public class ImageDemoActivity extends Activity implements OnClickListener { 24. /** Called when the activity is first created. */ 25. 26. public static String TAG = "IMAGE"; 27. public static int REQUEST_CODE = 0; 28. private ImageView mImageShow; 29. private ImageView mImageAltered; 30. 31. @Override 32. public void onCreate(Bundle savedInstanceState) { 33. super.onCreate(savedInstanceState); 34. setContentView(R.layout.main); 35. 36. Button imageSelectBtn = (Button) findViewById(R.id.imageSelectBtn); 37. mImageShow = (ImageView) findViewById(R.id.imageShow); 38. mImageAltered = (ImageView) findViewById(R.id.imageAltered); 39. imageSelectBtn.setOnClickListener(this); 40. } 41. 42. public void onClick(View v) { 43. // TODO Auto-generated method stub 44. Intent intent = new Intent(Intent.ACTION_PICK, 45. Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// 启动照片Gallery 46. startActivityForResult(intent, 0); 47. } 48. 49. @Override 50. protected void onActivityResult(int requestCode, int resultCode, 51. Intent intent) { 52. // TODO Auto-generated method stub 53. super.onActivityResult(requestCode, resultCode, intent); 54. 55. if (resultCode == RESULT_OK) {// 操作成功 56. Uri imgFileUri = intent.getData();// 获得所选照片的信息 57. Log.d(TAG, "imgFileUri is :" + imgFileUri); 58. // 由于返回的图像可能太大而无法完全加载到内存中。系统有限制,需要处理。 59. Display currentDisplay = getWindowManager().getDefaultDisplay(); 60. int defaultHeight = currentDisplay.getHeight(); 61. int defaultWidth = currentDisplay.getWidth(); 62. 63. BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options(); 64. bitmapFactoryOptions.inJustDecodeBounds = false;// /只是为获取原始图片的尺寸,而不返回Bitmap对象 65. // 注上:If set to true, the decoder will return null (no bitmap), but 66. // the out... fields will still be set, 67. // allowing the caller to query the bitmap without having to 68. // allocate the memory for its pixels 69. try { 70. Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver() 71. .openInputStream(imgFileUri), null, 72. bitmapFactoryOptions); 73. int outHeight = bitmapFactoryOptions.outHeight; 74. int outWidth = bitmapFactoryOptions.outWidth; 75. int heightRatio = (int) Math.ceil((float) outHeight 76. / defaultHeight); 77. int widthRatio = (int) Math.ceil((float) outWidth 78. / defaultWidth); 79. 80. if (heightRatio > 1 || widthRatio > 1) { 81. if (heightRatio > widthRatio) { 82. bitmapFactoryOptions.inSampleSize = heightRatio; 83. } else { 84. bitmapFactoryOptions.inSampleSize = widthRatio; 85. } 86. } 87. 88. bitmapFactoryOptions.inJustDecodeBounds = false; 89. bitmap = BitmapFactory.decodeStream(getContentResolver() 90. .openInputStream(imgFileUri), null, 91. bitmapFactoryOptions); 92. 93. mImageShow.setImageBitmap(bitmap); 94. 95. // /* 96. // * 在位图上绘制位图 97. // */ 98. // 99. // Bitmap bitmapAltered = Bitmap.createBitmap(bitmap.getWidth(), 100. // bitmap.getHeight(), bitmap.getConfig()); 101. // 102. // Canvas canvas = new 103. // Canvas(bitmapAltered);//bitmap提供了画布,只在此提供了大小尺寸,偏移后并未有背景显示出来 104. // 105. // 106. // Paint paint = new Paint(); 107. // 108. // canvas.drawBitmap(bitmap, 0, 0, paint);//绘制的图片和之前的一模一样 109. // 110. // mImageAltered.setImageBitmap(bitmapAltered); 111. 112. /* 113. * 使用矩阵 114. */ 115. 116. Bitmap bitmapAltered = Bitmap.createBitmap(bitmap.getWidth(), 117. bitmap.getHeight(), bitmap.getConfig());// 缺点是限定画布大小,处理后的图片可能被截断,可引入矩阵构造方法,动态设定画布大小 www.atcpu.com 118. Canvas canvas = new Canvas(bitmapAltered);// bitmap提供了画布,只在此提供了大小尺寸,偏移后并未有背景显示出来, 119. Paint paint = new Paint(); 120. 121. Matrix matrix = new Matrix(); 122. 123. // 1:缩放 124. // matrix.setValues(new float[] {//涉及线性代数的知识,可以翻翻相乘的基础知识 125. // 1,0,0,//算出x的值 126. // 0,1,0,//算出y的值 127. // 0,0,1//二维图用不到 128. // }); 129. 130. // 2:倾斜 131. // matrix.setValues(new float[] {//涉及线性代数的知识,可以翻翻相乘的基础知识 132. // 1,.5f,0,//算出x的值,x,y值相关 133. // 0,1,0,//算出y的值 134. // 0,0,1//二维图用不到 135. // }); 136. 137. // 3:旋转 138. // matrix.setRotate(45);//设置旋转角度,(0,0)点,顺时针旋转45度 139. 140. // 4,缩放plus:使用Matrix类方法//需要修改画布宽度>1.5倍* 原始宽度 141. // matrix.setScale(1.5f, 1); 142. 143. // 5,平移 144. // matrix.setTranslate(10, 0); 145. 146. // 6,镜像 147. // eg1:x轴镜像 148. // matrix.setScale(-1, 1);//向左绘制,原始图片沿y轴对称 149. // matrix.postTranslate(bitmap.getWidth(), 0);//注意是post即后移动 150. // eg2:y轴镜像 151. matrix.setScale(1, -1);// 向上绘制,原始图片沿x轴对称,图像在第四象限 152. matrix.postTranslate(0, bitmap.getHeight());// 注意是post即后移动 153. 154. 155. //~optimize~因为指定画布大小bitmapAltered,所以处理后的图片可能被截断,可以通过矩阵动态改变bitmapAltered大小 156. //eg: matrix.setRotate(degrees, px, py) 157. //bitmapAltered = Bitmap.createBitmap(source, x, y, width, height, m, filter);//显然矩阵影响其大小 158. 159. // 160. 161. // 注:for more details :Wikipedia Transformation Matrix 162. // http://en.wikipedia.org/wiki/Transformation_matrix 163. 164. canvas.drawBitmap(bitmap, matrix, paint);// 绘制的图片和之前的一模一样 165. 166. mImageAltered.setImageBitmap(bitmapAltered); 167. 168. } catch (FileNotFoundException e) { 169. // TODO Auto-generated catch block 170. e.printStackTrace(); 171. } 172. 173. } 174. } 175. } | |
![]() | ![]() |