虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Android编程 > Android绘制进阶之五:位图的处理

Android绘制进阶之五:位图的处理
类别:Android编程   作者:码皇   来源:互联网   点击:

图片的处理包括以下:1, 缩放2, 倾斜3, 旋转4, 缩放+5, 平移6, 镜像代码如下:1 package com mike activity;2 3 import java io FileNotFoundException;4 5 import android app Activity;6 impor

图片的处理包括以下:
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. }

 
摘自 小新专栏

相关热词搜索: Android 绘制 阶之