图片的处理包括以下:
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.2cto.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. }
摘自 小新专栏