图片剪切.docx
- 文档编号:17646903
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:20
- 大小:134.66KB
图片剪切.docx
《图片剪切.docx》由会员分享,可在线阅读,更多相关《图片剪切.docx(20页珍藏版)》请在冰点文库上搜索。
图片剪切
一:
主布局界面
二:
点击控件触发事件后效果图
三:
拍照完之后效果图
四:
裁剪界面效果图
五:
点击相册后返回的图片效果图
六:
裁剪完从相册PICK的保存后的效果图
下面直接来看下主控制类代码,如下:
1. packagecom.xiaoma.piccut.demo;
2.
3. importjava.io.File;
4. importandroid.app.Activity;
5. importandroid.app.AlertDialog;
6. importandroid.content.DialogInterface;
7. importandroid.content.Intent;
8. importandroid.graphics.Bitmap;
9. importandroid.graphics.drawable.BitmapDrawable;
10. importandroid.graphics.drawable.Drawable;
11. import.Uri;
12. importandroid.os.Bundle;
13. importandroid.os.Environment;
14. importandroid.provider.MediaStore;
15. importandroid.view.View;
16. importandroid.view.View.OnClickListener;
17. importandroid.widget.Button;
18. importandroid.widget.ImageButton;
19. importandroid.widget.ImageView;
20. /**
21. *@Title:
PicCutDemoActivity.java
22. *@Packagecom.xiaoma.piccut.demo
23. *@Description:
图片裁剪功能测试
24. *@authorXiaoMa
25. */
26. publicclassPicCutDemoActivityextendsActivityimplementsOnClickListener{
27.
28. privateImageButtonib=null;
29. privateImageViewiv=null;
30. privateButtonbtn=null;
31. privateStringtp=null;
32.
33.
34. /**Calledwhentheactivityisfirstcreated.*/
35. @Override
36. publicvoidonCreate(BundlesavedInstanceState){
37. super.onCreate(savedInstanceState);
38. setContentView(R.layout.main);
39. //初始化
40. init();
41. }
42.
43. /**
44. *初始化方法实现
45. */
46. privatevoidinit(){
47. ib=(ImageButton)findViewById(R.id.imageButton1);
48. iv=(ImageView)findViewById(R.id.imageView1);
49. btn=(Button)findViewById(R.id.button1);
50. ib.setOnClickListener(this);
51. iv.setOnClickListener(this);
52. btn.setOnClickListener(this);
53. }
54.
55.
56. /**
57. *控件点击事件实现
58. *
59. *因为有朋友问不同控件的背景图裁剪怎么实现,
60. *我就在这个地方用了三个控件,只为了自己记录学习
61. *大家觉得没用的可以跳过啦
62. */
63. @Override
64. publicvoidonClick(Viewv){
65. switch(v.getId()){
66. caseR.id.imageButton1:
67. ShowPickDialog();
68. break;
69. caseR.id.imageView1:
70. ShowPickDialog();
71. break;
72. caseR.id.button1:
73. ShowPickDialog();
74. break;
75.
76. default:
77. break;
78. }
79. }
80.
81. /**
82. *选择提示对话框
83. */
84. privatevoidShowPickDialog(){
85. newAlertDialog.Builder(this)
86. .setTitle("设置头像...")
87. .setNegativeButton("相册",newDialogInterface.OnClickListener(){
88. publicvoidonClick(DialogInterfacedialog,intwhich){
89. dialog.dismiss();
90. /**
91. *刚开始,我自己也不知道ACTION_PICK是干嘛的,后来直接看Intent源码,
92. *可以发现里面很多东西,Intent是个很强大的东西,大家一定仔细阅读下
93. */
94. Intentintent=newIntent(Intent.ACTION_PICK,null);
95.
96. /**
97. *下面这句话,与其它方式写是一样的效果,如果:
98. *intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
99. *intent.setType(""image/*");设置数据类型
100. *如果朋友们要限制上传到服务器的图片类型时可以直接写如:
"image/jpeg、image/png等的类型"
101. *这个地方小马有个疑问,希望高手解答下:
就是这个数据URI与类型为什么要分两种形式来写呀?
有什么区别?
102. */
103. intent.setDataAndType(
104. MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
105. "image/*");
106. startActivityForResult(intent,1);
107.
108. }
109. })
110. .setPositiveButton("拍照",newDialogInterface.OnClickListener(){
111. publicvoidonClick(DialogInterfacedialog,intwhichButton){
112. dialog.dismiss();
113. /**
114. *下面这句还是老样子,调用快速拍照功能,至于为什么叫快速拍照,大家可以参考如下官方
115. *文档,you_sdk_path/docs/guide/topics/media/camera.html
116. *我刚看的时候因为太长就认真看,其实是错的,这个里面有用的太多了,所以大家不要认为
117. *官方文档太长了就不看了,其实是错的,这个地方小马也错了,必须改正
118. */
119. Intentintent=newIntent(
120. MediaStore.ACTION_IMAGE_CAPTURE);
121. //下面这句指定调用相机拍照后的照片存储的路径
122. intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri
123. .fromFile(newFile(Environment
124. .getExternalStorageDirectory(),
125. "xiaoma.jpg")));
126. startActivityForResult(intent,2);
127. }
128. }).show();
129. }
130.
131. @Override
132. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
133. switch(requestCode){
134. //如果是直接从相册获取
135. case1:
136. startPhotoZoom(data.getData());
137. break;
138. //如果是调用相机拍照时
139. case2:
140. Filetemp=newFile(Environment.getExternalStorageDirectory()
141. +"/xiaoma.jpg");
142. startPhotoZoom(Uri.fromFile(temp));
143. break;
144. //取得裁剪后的图片
145. case3:
146. /**
147. *非空判断大家一定要验证,如果不验证的话,
148. *在剪裁之后如果发现不满意,要重新裁剪,丢弃
149. *当前功能时,会报NullException,小马只
150. *在这个地方加下,大家可以根据不同情况在合适的
151. *地方做判断处理类似情况
152. *
153. */
154. if(data!
=null){
155. setPicToView(data);
156. }
157. break;
158. default:
159. break;
160.
161. }
162. super.onActivityResult(requestCode,resultCode,data);
163. }
164.
165. /**
166. *裁剪图片方法实现
167. *@paramuri
168. */
169. publicvoidstartPhotoZoom(Uriuri){
170. /*
171. *至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页
172. *yourself_sdk_path/docs/reference/android/content/Intent.html
173. *直接在里面Ctrl+F搜:
CROP,之前小马没仔细看过,其实安卓系统早已经有自带图片裁剪功能,
174. *是直接调本地库的,小马不懂CC++ 这个不做详细了解去了,有轮子就用轮子,不再研究轮子是怎么
175. *制做的了...吼吼
176. */
177. Intentintent=newIntent("com.android.camera.action.CROP");
178. intent.setDataAndType(uri,"image/*");
179. //下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
180. intent.putExtra("crop","true");
181. //aspectXaspectY是宽高的比例
182. intent.putExtra("aspectX",1);
183. intent.putExtra("aspectY",1);
184. //outputXoutputY是裁剪图片宽高
185. intent.putExtra("outputX",150);
186. intent.putExtra("outputY",150);
187. intent.putExtra("return-data",true);
188. startActivityForResult(intent,3);
189. }
190.
191. /**
192. *保存裁剪之后的图片数据
193. *@parampicdata
194. */
195. privatevoidsetPicToView(Intentpicdata){
196. Bundleextras=picdata.getExtras();
197. if(extras!
=null){
198. Bitmapphoto=extras.getParcelable("data");
199. Drawabledrawable=newBitmapDrawable(photo);
200.
201. /**
202. *下面注释的方法是将裁剪之后的图片以Base64Coder的字符方式上
203. *传到服务器,QQ头像上传采用的方法跟这个类似
204. */
205.
206. /*ByteArrayOutputStreamstream=newByteArrayOutputStream();
207. press(Bitmap.CompressFormat.JPEG,60,stream);
208. byte[]b=stream.toByteArray();
209. //将图片流以字符串形式存储下来
210.
211. tp=newString(Base64Coder.encodeLines(b));
212. 这个地方大家可以写下给服务器上传图片的实现,直接把tp直接上传就可以了,
213. 服务器处理的方法是服务器那边的事了,吼吼
214.
215. 如果下载到的服务器的数据还是以Base64Coder的形式的话,可以用以下方式转换
216. 为我们可以用的图片类型就OK啦...吼吼
217. BitmapdBitmap=BitmapFactory.decodeFile(tp);
218. Drawabledrawable=newBitmapDrawable(dBitmap);
219. */
220. ib.setBackgroundDrawable(drawable);
221. iv.setBackgroundDrawable(drawable);
222. }
223. }
224.
225. }
下面来看下裁剪中用到的类,大家详细看下头注释:
1. packagecom.xiaoma.piccut.demo;
2.
3.
4.
5.
6. /**
7. *下面这些注释是下载这个类的时候本来就有的,本来要删除的,但看了下竟然是license,吼吼,
8. *好东西,留在注释里,以备不时之用,大家有需要加license的可以到下面的网址找哦
9. */
10.
11. //EPL,EclipsePublicLicense,V1.0orlater,http:
//www.eclipse.org/legal
12. //LGPL,GNULesserGeneralPublicLicense,V2.1orlater,http:
//www.gnu.org/licenses/lgpl.html
13. //GPL,GNUGeneralPublicLicense,V2orlater,http:
//www.gnu.org/licenses/gpl.html
14. //AL,ApacheLicense,V2.0orlater,http:
//www.apache.org/licenses
15. //BSD,BSDLicense,http:
//www.opensource.org/licenses/bsd-license.php
16. /**
17. *ABase64encoder/decoder.
18. *
19. *
20. *ThisclassisusedtoencodeanddecodedatainBase64formatasdescribedinRFC1521.
21. *
22. *
23. *Projecthomepage:
//www.source-code.biz/base64coder/java/">www.source-code.biz/base64coder/java 24. *Author: Christiand'Heureuse,InventecInformatik
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图片 剪切