首页 > 其他分享 >Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

时间:2023-08-09 23:32:44浏览次数:45  
标签:缩放 void new import android 上传 public 图片


仿照微信,朋友圈分享图片功能 。可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 。很不错的源码,大家有需要可以下载看看 。




Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_移动开发

微信




Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_java_02

微信




Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_java_03

微信




Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_人工智能_04

微信



下载地址 : 微信上传图片源码

很多网友不知道怎么获取图片路径,这里贴出来:

String path = Bimp.tempSelectBitmap.get(position).getImagePath();

//部分代码如下

 


 
     
  
1. package com.king.photo.activity;  
2.    
3. import android.annotation.SuppressLint;  
4. import android.app.Activity;  
5. import android.content.Context;  
6. import android.content.Intent;  
7. import android.graphics.Bitmap;  
8. import android.graphics.BitmapFactory;  
9. import android.graphics.Color;  
10. import android.graphics.drawable.BitmapDrawable;  
11. import android.graphics.drawable.ColorDrawable;  
12. import android.os.Bundle;  
13. import android.os.Handler;  
14. import android.os.Message;  
15. import android.provider.MediaStore;  
16. import android.util.Log;  
17. import android.view.Gravity;  
18. import android.view.KeyEvent;  
19. import android.view.LayoutInflater;  
20. import android.view.View;  
21. import android.view.View.OnClickListener;  
22. import android.view.ViewGroup;  
23. import android.view.ViewGroup.LayoutParams;  
24. import android.view.animation.AnimationUtils;  
25. import android.widget.AdapterView;  
26. import android.widget.AdapterView.OnItemClickListener;  
27. import android.widget.BaseAdapter;  
28. import android.widget.Button;  
29. import android.widget.GridView;  
30. import android.widget.ImageView;  
31. import android.widget.LinearLayout;  
32. import android.widget.PopupWindow;  
33. import android.widget.RelativeLayout;  
34.    
35. import com.king.photo.R;  
36. import com.king.photo.util.Bimp;  
37. import com.king.photo.util.FileUtils;  
38. import com.king.photo.util.ImageItem;  
39. import com.king.photo.util.PublicWay;  
40. import com.king.photo.util.Res;  
41.    
42.    
43.    
44. //首页面activity  
45.    
46. public class MainActivity extends Activity {  
47.    
48. private GridView noScrollgridview;  
49. private GridAdapter adapter;  
50. private View parentView;  
51. private PopupWindow pop = null;  
52. private LinearLayout ll_popup;  
53. public static Bitmap bimap ;  
54.       
55. protected void onCreate(Bundle savedInstanceState) {  
56. super.onCreate(savedInstanceState);  
57. this);  
58.         bimap = BitmapFactory.decodeResource(  
59.                 getResources(),  
60.                 R.drawable.icon_addpic_unfocused);  
61. this);  
62. null);  
63.         setContentView(parentView);  
64.         Init();  
65.     }  
66.    
67. public void Init() {  
68.           
69. new PopupWindow(MainActivity.this);  
70.           
71. null);  
72.    
73.         ll_popup = (LinearLayout) view.findViewById(R.id.ll_popup);  
74.           
75.         pop.setWidth(LayoutParams.MATCH_PARENT);  
76.         pop.setHeight(LayoutParams.WRAP_CONTENT);  
77. new BitmapDrawable());  
78. true);  
79. true);  
80.         pop.setContentView(view);  
81.           
82.         RelativeLayout parent = (RelativeLayout) view.findViewById(R.id.parent);  
83.         Button bt1 = (Button) view  
84.                 .findViewById(R.id.item_popupwindows_camera);  
85.         Button bt2 = (Button) view  
86.                 .findViewById(R.id.item_popupwindows_Photo);  
87.         Button bt3 = (Button) view  
88.                 .findViewById(R.id.item_popupwindows_cancel);  
89. new OnClickListener() {  
90.               
91. @Override  
92. public void onClick(View v) {  
93. // TODO Auto-generated method stub  
94.                 pop.dismiss();  
95.                 ll_popup.clearAnimation();  
96.             }  
97.         });  
98. new OnClickListener() {  
99. public void onClick(View v) {  
100.                 photo();  
101.                 pop.dismiss();  
102.                 ll_popup.clearAnimation();  
103.             }  
104.         });  
105. new OnClickListener() {  
106. public void onClick(View v) {  
107. new Intent(MainActivity.this,  
108. class);  
109.                 startActivity(intent);  
110.                 overridePendingTransition(R.anim.activity_translate_in, R.anim.activity_translate_out);  
111.                 pop.dismiss();  
112.                 ll_popup.clearAnimation();  
113.             }  
114.         });  
115. new OnClickListener() {  
116. public void onClick(View v) {  
117.                 pop.dismiss();  
118.                 ll_popup.clearAnimation();  
119.             }  
120.         });  
121.           
122.         noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);    
123. new ColorDrawable(Color.TRANSPARENT));  
124. new GridAdapter(this);  
125.         adapter.update();  
126.         noScrollgridview.setAdapter(adapter);  
127. new OnItemClickListener() {  
128.    
129. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
130. long arg3) {  
131. if (arg2 == Bimp.tempSelectBitmap.size()) {  
132. "ddddddd", "----------");  
133. this,R.anim.activity_translate_in));  
134. 0, 0);  
135. else {  
136. new Intent(MainActivity.this,  
137. class);  
138. "position", "1");  
139. "ID", arg2);  
140.                     startActivity(intent);  
141.                 }  
142.             }  
143.         });  
144.    
145.     }  
146.    
147. @SuppressLint("HandlerLeak")  
148. public class GridAdapter extends BaseAdapter {  
149. private LayoutInflater inflater;  
150. private int selectedPosition = -1;  
151. private boolean shape;  
152.    
153. public boolean isShape() {  
154. return shape;  
155.         }  
156.    
157. public void setShape(boolean shape) {  
158. this.shape = shape;  
159.         }  
160.    
161. public GridAdapter(Context context) {  
162.             inflater = LayoutInflater.from(context);  
163.         }  
164.    
165. public void update() {  
166.             loading();  
167.         }  
168.    
169. public int getCount() {  
170. if(Bimp.tempSelectBitmap.size() == 9){  
171. return 9;  
172.             }  
173. return (Bimp.tempSelectBitmap.size() + 1);  
174.         }  
175.    
176. public Object getItem(int arg0) {  
177. return null;  
178.         }  
179.    
180. public long getItemId(int arg0) {  
181. return 0;  
182.         }  
183.    
184. public void setSelectedPosition(int position) {  
185.             selectedPosition = position;  
186.         }  
187.    
188. public int getSelectedPosition() {  
189. return selectedPosition;  
190.         }  
191.    
192. public View getView(int position, View convertView, ViewGroup parent) {  
193. null;  
194. if (convertView == null) {  
195.                 convertView = inflater.inflate(R.layout.item_published_grida,  
196. false);  
197. new ViewHolder();  
198.                 holder.image = (ImageView) convertView  
199.                         .findViewById(R.id.item_grida_image);  
200.                 convertView.setTag(holder);  
201. else {  
202.                 holder = (ViewHolder) convertView.getTag();  
203.             }  
204.    
205. if (position ==Bimp.tempSelectBitmap.size()) {  
206.                 holder.image.setImageBitmap(BitmapFactory.decodeResource(  
207.                         getResources(), R.drawable.icon_addpic_unfocused));  
208. if (position == 9) {  
209.                     holder.image.setVisibility(View.GONE);  
210.                 }  
211. else {  
212.                 holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap());  
213.             }  
214.    
215. return convertView;  
216.         }  
217.    
218. public class ViewHolder {  
219. public ImageView image;  
220.         }  
221.    
222. new Handler() {  
223. public void handleMessage(Message msg) {  
224. switch (msg.what) {  
225. case 1:  
226.                     adapter.notifyDataSetChanged();  
227. break;  
228.                 }  
229. super.handleMessage(msg);  
230.             }  
231.         };  
232.    
233. public void loading() {  
234. new Thread(new Runnable() {  
235. public void run() {  
236. while (true) {  
237. if (Bimp.max == Bimp.tempSelectBitmap.size()) {  
238. new Message();  
239. 1;  
240.                             handler.sendMessage(message);  
241. break;  
242. else {  
243. 1;  
244. new Message();  
245. 1;  
246.                             handler.sendMessage(message);  
247.                         }  
248.                     }  
249.                 }  
250.             }).start();  
251.         }  
252.     }  
253.    
254. public String getString(String s) {  
255. null;  
256. if (s == null)  
257. return "";  
258. for (int i = s.length() - 1; i > 0; i++) {  
259.             s.charAt(i);  
260.         }  
261. return path;  
262.     }  
263.    
264. protected void onRestart() {  
265.         adapter.update();  
266. super.onRestart();  
267.     }  
268.    
269. private static final int TAKE_PICTURE = 0x000001;  
270.    
271. public void photo() {  
272. new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
273.         startActivityForResult(openCameraIntent, TAKE_PICTURE);  
274.     }  
275.    
276. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
277. switch (requestCode) {  
278. case TAKE_PICTURE:  
279. if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) {  
280.                   
281.                 String fileName = String.valueOf(System.currentTimeMillis());  
282. "data");  
283.                 FileUtils.saveBitmap(bm, fileName);  
284.                   
285. new ImageItem();  
286.                 takePhoto.setBitmap(bm);  
287.                 Bimp.tempSelectBitmap.add(takePhoto);  
288.             }  
289. break;  
290.         }  
291.     }  
292.       
293. public boolean onKeyDown(int keyCode, KeyEvent event) {  
294. if (keyCode == KeyEvent.KEYCODE_BACK) {  
295. for(int i=0;i<PublicWay.activityList.size();i++){  
296. if (null != PublicWay.activityList.get(i)) {  
297.                     PublicWay.activityList.get(i).finish();  
298.                 }  
299.             }  
300. 0);  
301.         }  
302. return true;  
303.     }  
304.    
305. }  
306.    
307.


 

下载地址 : 微信上传图片源码

备份下载地址:

 

补充:

通过GridView仿微信动态添加本地图片

 

此篇文章主要讲述GridView控件实现添加本地图片并显示.主要是关于GridView控件的基本操作,通常可以通过自定义继承BaseAdapter的适配器加载图片,而下面讲述的不是自定义的适配器,而是调用SimpleAdapter实现的.至于上传发布与网络交互此处不讲述,后面文章会讲!

一. 实现效果



主要是通过点击+从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看,不足之处在于+好没有移动至最后,但原理相同.



  

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_java_05

  

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_微信_06

  

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_java_07




二. 项目工程结构






Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_移动开发_08






三. 界面布局详细代码

    1.主界面activity_main.xml    主要通过相对布局实现,第一部分是底部的TextView,中间是EditView和GridView相对布局,下面是两个按钮.同时EditView调用res/drawable-hdpi中的editview_shape.xml,GridView显示的每张图片通过griditem_addpic.xml实现.


 

1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
2. xmlns:tools="http://schemas.android.com/tools"  
3. android:id="@+id/container"  
4. android:layout_width="match_parent"  
5. android:layout_height="match_parent"  
6. tools:context="com.example.suishoupaipublish.MainActivity"  
7. tools:ignore="MergeRootFrame" >  
8.       
9. <!-- 顶部添加文字 -->   
10. <RelativeLayout    
11. android:id="@+id/Layout_top"    
12. android:orientation="horizontal"     
13. android:layout_width="fill_parent"    
14. android:layout_height="40dp"    
15. android:layout_marginTop="5dp"  
16. android:layout_alignParentTop="true"    
17. android:gravity="center">    
18. <TextView    
19. android:layout_width="fill_parent"     
20. android:layout_height="wrap_content"      
21. android:textSize="25sp"  
22. android:gravity="center"  
23. android:text="发布信息" />   
24. </RelativeLayout>    
25. <!-- 底部按钮 -->    
26. <RelativeLayout    
27. android:id="@+id/Layout_bottom"     
28. android:layout_alignParentBottom="true"  
29. android:layout_width="fill_parent"     
30. android:layout_height="50dp"  
31. android:gravity="center" >    
32. <Button    
33. android:id="@+id/button1"    
34. android:layout_width="wrap_content"    
35. android:layout_height="fill_parent"  
36. android:textSize="20sp"  
37. android:text="发布拍拍" />    
38. <Button    
39. android:id="@+id/button2"    
40. android:layout_width="wrap_content"    
41. android:layout_height="fill_parent"  
42. android:layout_toRightOf="@+id/button1"  
43. android:textSize="20sp"  
44. android:text="取消发布" />  
45. </RelativeLayout>    
46. <!-- 显示图片 -->    
47. <RelativeLayout    
48. android:id="@+id/Content_Layout"       
49. android:layout_width="fill_parent"     
50. android:layout_height="fill_parent"    
51. android:layout_above="@id/Layout_bottom"     
52. android:layout_below="@id/Layout_top"      
53. android:gravity="center">       
54. <LinearLayout     
55. android:layout_width="match_parent"    
56. android:layout_height="match_parent"    
57. android:orientation="vertical"  
58. android:layout_alignParentBottom="true" >   
59. <!-- 设置运行多行 设置圆角图形 黑色字体-->  
60. <EditText   
61. android:id="@+id/editText1"  
62. android:layout_height="120dp"  
63. android:layout_width="fill_parent"  
64. android:textColor="#000000"  
65. android:layout_margin="12dp"  
66. android:textSize="20sp"  
67. android:hint="随手说出你此刻的心声..."  
68. android:maxLength="500"  
69. android:singleLine="false"  
70. android:background="@drawable/editview_shape" />  
71. <!-- 网格显示图片 行列间距5dp 每列宽度90dp -->  
72. <GridView  
73. android:id="@+id/gridView1"  
74. android:layout_width="fill_parent"  
75. android:layout_height="200dp"  
76. android:layout_margin="10dp"  
77. android:background="#EFDFDF"  
78. android:horizontalSpacing="5dp"  
79. android:verticalSpacing="5dp"  
80. android:numColumns="4"  
81. android:columnWidth="90dp"  
82. android:stretchMode="columnWidth"  
83. android:gravity="center" >  
84. </GridView>  
85. <TextView   
86. android:layout_width="fill_parent"  
87. android:layout_height="wrap_content"  
88. android:text="(友情提示:只能添加9张图片,长按图片可以删除已添加图片)"  
89. android:gravity="center" />  
90. </LinearLayout>  
91. </RelativeLayout>  
92.       
93. </RelativeLayout>

    2.显示ImageView图片布局griditem_addpic.xml

1. <?xml version="1.0" encoding="utf-8"?>  
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3. android:layout_width="match_parent"  
4. android:layout_height="match_parent"  
5. android:gravity="center"  
6. android:descendantFocusability="blocksDescendants"  
7. android:orientation="vertical" >  
8. <RelativeLayout  
9. android:layout_gravity="center"  
10. android:layout_width="80dp"  
11. android:layout_height="80dp"  
12. android:orientation="vertical" >  
13. <ImageView  
14. android:layout_marginTop="10dp"  
15. android:layout_marginRight="10dp"  
16. android:id="@+id/imageView1"  
17. android:layout_width="fill_parent"  
18. android:layout_height="fill_parent"  
19. android:scaleType="fitXY"  
20. android:src="@drawable/gridview_addpic" />  
21. </RelativeLayout>  
22. </LinearLayout>


    3.设置EditView控件圆角和颜色 editview_shape.xml


 

1. <?xml version="1.0" encoding="utf-8"?>  
2. <shape xmlns:android="http://schemas.android.com/apk/res/android"   
3. android:shape="rectangle"   
4. android:padding="10dp">  
5. <!-- 填充editView的颜色 -->  
6. <soild android:color="#ffffff"/>  
7. <!-- 设置圆角的弧度,radius半径越大,editView的边角越圆 -->  
8. <corners   
9. android:radius="15dp"  
10. android:bottomRightRadius="15dp"  
11. android:bottomLeftRadius="15dp"  
12. android:topLeftRadius="15dp"    
13. android:topRightRadius="15dp"/>  
14. <stroke  
15. android:color="#32CD32"    
16. android:width="4px" />   
17. </shape>


四. 代码详解



 



它主要是思想如下:
    1.通过SimpleAdapter适配器实现实现加载图片,在gridView1.setOnItemClickListener()点击函数中响应不同操作.
    2.当点击加号图片(+)时,调用本地相册通过Intent实现获取图片路径存于字符串pathImage.
    3.获取图片路径后在onResume中刷新图片,通过GridView的setAdapter()和notifyDataSetChanged()()函数刷新加载图片.
    4.点击图片时会获取其position,通过dialog()函数弹出对话框提示是否删除,通过remove实现删除.
    具体代码如下所示:


 


1. public class MainActivity extends Activity {  
2.   
3. private GridView gridView1;              //网格显示缩略图  
4. private Button buttonPublish;            //发布按钮  
5. private final int IMAGE_OPEN = 1;        //打开图片标记  
6. private String pathImage;                //选择图片路径  
7. private Bitmap bmp;                      //导入临时图片  
8. private ArrayList<HashMap<String, Object>> imageItem;  
9. private SimpleAdapter simpleAdapter;     //适配器  
10.       
11. @Override  
12. protected void onCreate(Bundle savedInstanceState) {  
13. super.onCreate(savedInstanceState);  
14.         setContentView(R.layout.activity_main);  
15. /*
16.          * 防止键盘挡住输入框
17.          * 不希望遮挡设置activity属性 android:windowSoftInputMode="adjustPan"
18.          * 希望动态调整高度 android:windowSoftInputMode="adjustResize"
19.          */  
20.         getWindow().setSoftInputMode(WindowManager.LayoutParams.  
21.                 SOFT_INPUT_ADJUST_PAN);  
22. //锁定屏幕  
23.         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
24.         setContentView(R.layout.activity_main);  
25. //获取控件对象  
26.         gridView1 = (GridView) findViewById(R.id.gridView1);  
27.   
28. /*
29.          * 载入默认图片添加图片加号
30.          * 通过适配器实现
31.          * SimpleAdapter参数imageItem为数据源 R.layout.griditem_addpic为布局
32.          */  
33. //获取资源图片加号  
34.         bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gridview_addpic);  
35. new ArrayList<HashMap<String, Object>>();  
36. new HashMap<String, Object>();  
37. "itemImage", bmp);  
38.         imageItem.add(map);  
39. new SimpleAdapter(this,   
40.                 imageItem, R.layout.griditem_addpic,   
41. new String[] { "itemImage"}, new int[] { R.id.imageView1});   
42. /*
43.          * HashMap载入bmp图片在GridView中不显示,但是如果载入资源ID能显示 如
44.          * map.put("itemImage", R.drawable.img);
45.          * 解决方法:
46.          *              1.自定义继承BaseAdapter实现
47.          *              2.ViewBinder()接口实现
48.          *  参考 
49.          */  
50. new ViewBinder() {    
51. @Override    
52. public boolean setViewValue(View view, Object data,    
53.                     String textRepresentation) {    
54. // TODO Auto-generated method stub    
55. if(view instanceof ImageView && data instanceof Bitmap){    
56.                     ImageView i = (ImageView)view;    
57.                     i.setImageBitmap((Bitmap) data);    
58. return true;    
59.                 }    
60. return false;    
61.             }  
62.         });    
63.         gridView1.setAdapter(simpleAdapter);  
64.           
65. /*
66.          * 监听GridView点击事件
67.          * 报错:该函数必须抽象方法 故需要手动导入import android.view.View;
68.          */  
69. new OnItemClickListener() {  
70. @Override  
71. public void onItemClick(AdapterView<?> parent, View v, int position, long id)  
72.             {  
73. if( imageItem.size() == 10) { //第一张为默认图片  
74. this, "图片数9张已满", Toast.LENGTH_SHORT).show();  
75.                 }  
76. else if(position == 0) { //点击图片位置为+ 0对应0张图片  
77. this, "添加图片", Toast.LENGTH_SHORT).show();  
78. //选择图片  
79. new Intent(Intent.ACTION_PICK,         
80.                             android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);    
81.                     startActivityForResult(intent, IMAGE_OPEN);    
82. //通过onResume()刷新数据  
83.                 }  
84. else {  
85.                     dialog(position);  
86. //Toast.makeText(MainActivity.this, "点击第"+(position + 1)+" 号图片",   
87. //      Toast.LENGTH_SHORT).show();  
88.                 }  
89.             }  
90.         });    
91.     }  
92.       
93. //获取图片路径 响应startActivityForResult    
94. protected void onActivityResult(int requestCode, int resultCode, Intent data) {    
95. super.onActivityResult(requestCode, resultCode, data);          
96. //打开图片    
97. if(resultCode==RESULT_OK && requestCode==IMAGE_OPEN) {          
98.             Uri uri = data.getData();    
99. if (!TextUtils.isEmpty(uri.getAuthority())) {    
100. //查询选择图片    
101.                 Cursor cursor = getContentResolver().query(    
102.                         uri,    
103. new String[] { MediaStore.Images.Media.DATA },    
104. null,     
105. null,     
106. null);    
107. //返回 没找到选择图片    
108. if (null == cursor) {    
109. return;    
110.                 }    
111. //光标移动至开头 获取图片路径    
112.                 cursor.moveToFirst();    
113.                 pathImage = cursor.getString(cursor    
114.                         .getColumnIndex(MediaStore.Images.Media.DATA));    
115.             }  
116. //end if 打开图片  
117.     }  
118.       
119. //刷新图片  
120. @Override  
121. protected void onResume() {  
122. super.onResume();  
123. if(!TextUtils.isEmpty(pathImage)){  
124.             Bitmap addbmp=BitmapFactory.decodeFile(pathImage);  
125. new HashMap<String, Object>();  
126. "itemImage", addbmp);  
127.             imageItem.add(map);  
128. new SimpleAdapter(this,   
129.                     imageItem, R.layout.griditem_addpic,   
130. new String[] { "itemImage"}, new int[] { R.id.imageView1});   
131. new ViewBinder() {    
132. @Override    
133. public boolean setViewValue(View view, Object data,    
134.                         String textRepresentation) {    
135. // TODO Auto-generated method stub    
136. if(view instanceof ImageView && data instanceof Bitmap){    
137.                         ImageView i = (ImageView)view;    
138.                         i.setImageBitmap((Bitmap) data);    
139. return true;    
140.                     }    
141. return false;    
142.                 }  
143.             });   
144.             gridView1.setAdapter(simpleAdapter);  
145.             simpleAdapter.notifyDataSetChanged();  
146. //刷新后释放防止手机休眠后自动添加  
147. null;  
148.         }  
149.     }  
150.       
151. /*
152.      * Dialog对话框提示用户删除操作
153.      * position为删除图片位置
154.      */  
155. protected void dialog(final int position) {  
156. new Builder(MainActivity.this);  
157. "确认移除已添加图片吗?");  
158. "提示");  
159. "确认", new DialogInterface.OnClickListener() {  
160. @Override  
161. public void onClick(DialogInterface dialog, int which) {  
162.                 dialog.dismiss();  
163.                 imageItem.remove(position);  
164.                 simpleAdapter.notifyDataSetChanged();  
165.             }  
166.         });  
167. "取消", new DialogInterface.OnClickListener() {  
168. @Override  
169. public void onClick(DialogInterface dialog, int which) {  
170.                 dialog.dismiss();  
171.                 }  
172.             });  
173.         builder.create().show();  
174.     }  
175.   
176. }


    同时需要在AndroidMainfest.xml中添加权限操作SD卡和网络上传至服务器.



1. <!-- 申明网络权限  -->  
2. <uses-permission android:name="android.permission.INTERNET" />  
3. <!-- 申明权限 操作SD卡 -->    
4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

五. 总结






该文章需要注意一个地方:在使用SimpleAdapter适配器加载bmp图片时,可能在GridView中不显示.即HashMap中map.put("itemImage",bmp)不显示图片,而使用put装入R.drawable.img却能显示.
    这时有两种解决方法,一种是自定义继承BaseAdapter的适配器实现;另一种方法则是如上所示通过ViewBinder()接口实现,感谢博主dmin_提供的方法.
    下载地址:



 

下面再分享个图片处理的博客。

 demo下载地址: 
        
        http://pan.baidu.com/s/1c0kz3by

一. 项目结构及界面

 

        项目工程结构如下图所示:




Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_人工智能_09

  


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_移动开发_10


个人还是比较欣赏这个布局的,其中MainActivity.java是主界面,ProcessActivity.java是图像处理界面,而剩余五个java对应五个不同的图像处理算法:EffectProcessImage(图像特效)、FrameProcessImage(添加相框)、IncreaseProcessImage(图像增强)、PersonProcessImage(图像交互)和WatchProcessImage(查看图片).
        同时Layout中有五个xml子布局,采用PopupWindow形式显示五个不同的处理,同时该demo比较好移植,将文件依次复制过去并且MainActivity改成子活动,即可调用.
        其中部分界面如下:

 

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_微信_11

  

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_移动开发_12

  

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_android_13



MainActivity主界面                              添加图片选项                          图像处理子界面(底部五个) 


 

二. 图像查看功能

        点击主界面GridView中"+"添加图片后,可以选择从相册添加或照相,加载图片进行到处理界面后,点击底部"查看"按钮它会有选中的效果(图标颜色变蓝&背景颜色加深).同时PopupWindow弹出如下界面:


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_微信_14

        其中点击"旋转"后提交的动态图如下所示:


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_移动开发_15

    

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_移动开发_16

        参考以前我的博客:


            [Android] 拍照、截图、保存并显示在ImageView控件中        
            [Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理            [Android] 触屏setOnTouchListener实现图片缩放、移动、绘制和添加水印        其他效果如下,同时存在几个问题:
            1.图像绘图保存我没有做
            2.移动和缩放图像,上传的都是原图大小
            3.添加水印功能感觉简单就没实现


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_java_17

 

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_人工智能_18

 



三. 图像增强功能

        图像增强主要是通过3个进度条SeekBar实现,可以调节图像的饱和度、亮度和色相.当饱和度等于0时就是黑白二值图像,三个滑动条可以相互调节.如下图所示:


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_人工智能_19


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_微信_20

        参考我的以前博客:
            [Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理            [Android] 图像处理整合之处理ColorMatrix和Intend传递路径显示图像            [Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)        同时需要注意一个问题: 设置滑动条时需要设置其区间,同时在弹出PopupWindow注意其宽度和不同手机的适屏处理.
        该部分算法处理代码如下,每部分算法调用后返回值都是bitmap,然后调用imageShow.setImageBitmap(mbmp);直接显示.


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_微信_21


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_android_22


 

四. 图像特效功能

        PopupWindow弹出如下界面,主要包括:怀旧、浮雕、光照、素描和锐化处理.

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_移动开发_23


        其中特效效果和EffectProcessImage.java如下所示:


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_android_24

    

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_android_25

        参考我的博客:
            [Android] 通过Menu实现图片怀旧、浮雕、模糊、光照和素描效果            [Android] 图像各种处理系列文章合集 (草稿 强推)
        同时算法中存在一些问题,一个就是效率不高,有好友建议C写算法来调用,但是该文章仅是课堂作业,提供一种方法供大家参考.同时在图像素描算法效果不好,锐化处理应该也不对(可参考博客),光照效果是从中心向边沿映射,用户可自己设置光照直径和方向.


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_人工智能_26

            

 

五. 图像相框添加

        最后是图像相框合成,如下图所示.我采用的是照相后合成图片:


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_人工智能_27

    

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_人工智能_28

        添加相框功能主要是通过两张图片的合成,我也见到过四张图片分别合成相框的效果.但我更喜欢这种两张图片合成的,在assets文件夹中加载透明图片.详见:
        [Android] 给图像添加相框、圆形圆角显示图片、图像合成知识


 

六. 总结及感想

        该处理过程中的底部五个按钮切换背景和颜色详见代码ProcessActivity.java,主要是通切换两张图片和背景实现.如果每个界面显示不同内容,建议使用Fragment滑动实现.参考:
        [Android] 使用Include布局+Fragment滑动切换屏幕        [Android] 通过GridView仿微信动态添加本地图片        随手拍我还是比较满意的,其中后台数据库我们使用的是新浪SAE做的,同时ListView刷新拍拍也非常不错!效果如下:


Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_微信_29

  

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_java_30

  

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等_人工智能_31

        上传的demo我把发布功能删除了,它是通过线程和Process进度条来上传多张图片的.同时ListView可以刷新最近发布消息,点击图片可以查看大图.可以对发布的拍拍进行评论、关注、点赞等操作.
        但是由于整个项目是大家一起完成,包括网络、数据库(SAE)、ListView(引用开源),所以只能共享我做的那部分.抱歉~如果有时间可以写些关于Android网络方面的文章,包括如何上传图片(URL链接存储在云盘中)、获取数据库内容等操作.

标签:缩放,void,new,import,android,上传,public,图片
From: https://blog.51cto.com/u_16112859/7027055

相关文章

  • HCS651关于OBS上传vmdk镜像失败问题处理过程
    报错现象:镜像转换失败处理过程1、登录CPT-SRV-01和02节点,排查/var/log/imcs/taskmgr/ims/下日志taskmgr_ims_executor.log报错信息,如没有日志,则逐个重启sysadmin进程;kill-9****(sysadmin的uid)2、修改/opt/imcs/tomcat/taskmgr/WEB-INF/classes/taskmgr-config.properties......
  • python 实现 pdf 转为图片
    1importfitz2importos3fromPILimportImage45defconvert_pdf2img(file_relative_path):67page_num=18filename=file_relative_path.split('.')[-2]9ifnotos.path.exists(filename):10os.makedirs(filen......
  • 图片链接
        ......
  • 安防视频监控平台EasyNVR页面无法上传授权文件,该如何进行授权?
    TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中,EasyNVR可提供视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视......
  • 静态图片
     ......
  • 转载:用pageOffice控件实现 office 文档在线编辑Word加图片的功能
    用pageOffice控件实现office文档在线编辑Word加图片的功能OA办公中,业务需要多人编辑word文档,需要加图片的功能。怎么实现word文档的编辑加图片呢?2实现方法通过pageOffice实现简单的在线打开编辑word时,通过设置关键代码:DataRegiondataRegion=worddoc.openDataRegion......
  • 前端将图片转为base64编码
    <script type="text/javascript">        function readAsBase64() {            var file = document.getElementById("imagefile").files[0];            var reader = new FileReader();            reader.readA......
  • 文件上传 - 存储的三种方案
     介绍优点缺点本地存储直接将图片保存到服务的硬盘开发便捷、成本低扩容难分布式文件系统自己搭建分布式文件系统(MinIO、FastDFS)容易实现扩容开发复杂度稍大第三方存储服务使用第三方存储服务(阿里云、华为云、腾讯云)开发简单、功能强大付费......
  • iOS 子工程(下沉组件 私有库) 调用文件、图片 等资源 方法
    发现问题:在子工程里面使用 [[NSBundlemainBundle]pathForResource:ofType:] 不能找到目标资源文件原因:[[NSBundlemainBundle]pathForResource:ofType:]是获取主程序包(MainBundle)中资源文件路径的方法。主程序包是指你的应用程序本身,而不包括子工程或子项目。那么要......
  • 国标GB28181视频平台LntonGBS(源码版)国标平台级联时,通道上传上级宇视平台无法接收的问
    LntonGBS是基于公安部推出的GB/T28181协议开发的视频平台,在安防监控领域应用广泛。下面是一些关于LntonGBS平台的主要特点:GB/T28181协议兼容性、视频直播和转码、云端录像和存储、语音对讲和警告功能、平台级联功能。通过以上的功能和特点,LntonGBS平台能够满足安防监控领域各类场景......