Android仿微信图片编辑处理:文字,马赛克,裁剪,涂鸦,旋转图片等

如图:

这个项目实现了微信图片编辑处理的关键功能,如给一张图片添加文字,打上马赛克,裁剪图片,在图片上手势涂鸦。引用了kareluo的Imaging库,但是kareluo的Imaging库示例代码有两个遗留问题需要重新解决:

1,它是用kotlin写的,我重新把kotlin代码部分用Java写了一遍。

2,kareluo的Imaging库中,编辑图片的IMGEditActivity接受两种传入的资源路径类型:asset和file。Android 4.4以下可以直接获取再拼装。但在高版本(大于4.4,API19)就不好办,且在大于4.4版本的机器上,用相册选择器选中的图片资源是以content://开头表示的,这需要把content://这样的路径重新转为file传过去。

我把上述两个问题解决后写了简单的测试:

package zhangphil.app;import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;import java.io.File;import me.kareluo.imaging.IMGEditActivity;public class MainActivity extends AppCompatActivity {public static final int REQ_SELECT_PHOTO = 0xf0a;private Bitmap avatarBitMap = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {seleteImg();}});}private void seleteImg() {Intent intent = new Intent();intent.setType("image/*");intent.setAction(Intent.ACTION_GET_CONTENT);startActivityForResult(intent, REQ_SELECT_PHOTO);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case REQ_SELECT_PHOTO: {// 选取照片。if (resultCode == RESULT_OK && data != null) {try {avatarBitMap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data.getData());//此处获得了Bitmap图片,可以用作设置头像等等。} catch (Exception e) {e.printStackTrace();}Intent intent = new Intent(this, IMGEditActivity.class);try {String uri_path = getFilePathByUri(this, data.getData());Uri uri = Uri.fromFile(new File(uri_path));System.out.println(uri.toString());intent.putExtra(IMGEditActivity.EXTRA_IMAGE_URI, uri);//intent.putExtra(IMGEditActivity.EXTRA_IMAGE_SAVE_PATH,);startActivity(intent);} catch (Exception e) {e.printStackTrace();}}break;}default:break;}}@TargetApi(19)public static String getFilePathByUri(Context context, Uri uri) {String path = null;// 以 file:// 开头的if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {path = uri.getPath();return path;}// 以 content:// 开头的,比如 content://media/extenral/images/media/17766if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);if (cursor != null) {if (cursor.moveToFirst()) {int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);if (columnIndex > -1) {path = cursor.getString(columnIndex);}}cursor.close();}return path;}// 4.4及之后的 是以 content:// 开头的,比如 content://com.android.providers.media.documents/document/image%3A235700if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {if (DocumentsContract.isDocumentUri(context, uri)) {if (isExternalStorageDocument(uri)) {// ExternalStorageProviderfinal String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];if ("primary".equalsIgnoreCase(type)) {path = Environment.getExternalStorageDirectory() + "/" + split[1];return path;}} else if (isDownloadsDocument(uri)) {// DownloadsProviderfinal String id = DocumentsContract.getDocumentId(uri);final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(id));path = getDataColumn(context, contentUri, null, null);return path;} else if (isMediaDocument(uri)) {// MediaProviderfinal String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];Uri contentUri = null;if ("image".equals(type)) {contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video".equals(type)) {contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio".equals(type)) {contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}final String selection = "_id=?";final String[] selectionArgs = new String[]{split[1]};path = getDataColumn(context, contentUri, selection, selectionArgs);return path;}}}return null;}public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {Cursor cursor = null;String column = MediaStore.Images.Media.DATA;String[] projection = {column};try {cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {int index = cursor.getColumnIndexOrThrow(column);return cursor.getString(index);}} finally {if (cursor != null)cursor.close();}return null;}/*** @param uri The Uri to check.* @return Whether the Uri authority is ExternalStorageProvider.*/public static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is DownloadsProvider.*/public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is MediaProvider.*/public static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is Google Photos.*/public static boolean isGooglePhotosUri(Uri uri) {return "com.google.android.apps.photos.content".equals(uri.getAuthority());}
}

亲测在Android8.0上正常。

完整可运行的项目已经整理出来,上传到github:https://github.com/zhangphil/WeiXinPictureTool

Android仿微信图片编辑处理:文字,马赛克,裁剪,涂鸦,旋转图片等相关推荐

  1. android 仿微信头像裁剪,Android仿微信QQ设置图形头像裁剪功能

    最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流. 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue ...

  2. android 微信朋友圈 全功能,Android仿微信朋友圈文字展开全文功能 Android自定义TextView仿微信朋友圈文字展开全文功能...

    Android自定义TextView仿微信朋友圈文字信息,展开全文功能 代码及注释如下: 首先写一个xml文件 showmore.xml: android:orientation="vert ...

  3. Android仿微信图片编辑库,你想要的功能这里都有

    最近项目需要,写了一个和微信中图片编辑功能类似的图片编辑库,除去问题操作上摈弃掉不方便的手势操作外,其余微信中的核心功能全部一致,保留了微信中涂鸦.马赛克.文字等随时随着图片缩放的功能,这点是我所找的 ...

  4. Android仿微信图片编辑——涂鸦框架Doodle(多功能画板)

    前言 很久之前做了一个叫Graffiti的涂鸦项目,放在了github上,得到了不少朋友的反馈,也一直有去维护.限制于个人能力水平,一开始并没有过多考虑框架的问题,导致越到后面,代码越臃肿,添加新功能 ...

  5. 高仿微信上传头像附带压缩,旋转图片,附加demo

    本人初学者,再做项目时要求上传头像要像微信那种,需要外面裁剪框不动,里面图片可以改变大小,android系统裁剪和所要求的完全相反,所以,对于这个问题,困扰了我将近一个月,不断的修改,不断的出现新问题 ...

  6. android仿微信图片编辑库,Android仿微信图片选择器

    很多项目要用到图片选择控件,每次都要写一大堆逻辑.于是基于图片选择组件(PhotoPicker)封装了一个控件PhotoUploadView.方便简易,一键集成,几句代码就可以添加类似微信的图片选择控 ...

  7. Android 仿微信裁剪图片

    在很多App 中,需要注册登录,那么就免不了 设置用户的头像.头像无非就是方形 或者 圆形,那么就诞生了这样一个需求: 从相册中选择一张图片 中间区域是圆形 或者 方形的透明裁剪框 裁剪框周围是阴影 ...

  8. Android仿微信朋友圈发图片和文字

    Android仿微信朋友圈发图片和文字的一个开源项目,其在github上的项目主页是:https://github.com/zhangphil/FangWeiXinPengYouQuanFaTuPia ...

  9. android 微信朋友圈 全功能,Android自定义TextView仿微信朋友圈文字展开全文功能

    Android自定义TextView仿微信朋友圈文字信息,展开全文功能 代码及注释如下: 首先写一个xml文件 showmore.xml: android:orientation="vert ...

最新文章

  1. DevOps火爆,招人却太难了!
  2. 纯JS制作的窗户雨滴效果
  3. rs485编程java_串行编程RS485
  4. 上传Text文档并转换为PDF
  5. centos mysql 5.5 art_Linux CentOS6.5下编译安装MySQL 5.5.51''''
  6. 《新一代人工智能发展白皮书(2017年)》重磅发布(100页完整版PPT)
  7. NLP(新闻文本分类)——基于机器学习的文本分类
  8. 2017.12.7 URAT 串口通信
  9. 矩阵手册(四)—— 增广矩阵
  10. python---之getattr
  11. VAE 中后验坍塌问题
  12. Mac OSX配置XAMP虚拟主机
  13. Linux常用操作命令(一)
  14. 技术分享:逆向破解华为路由器第三部分
  15. 电脑硬盘怎样合并分区?
  16. AI Conference:2018, 不容错过的世界人工智能大会 | 抢票
  17. 本科毕业平均年薪 30 万!经济寒冬挡不住 AI 人才的火热!
  18. java基础之后台线程_繁星漫天_新浪博客
  19. 2021年全球切削刀具市场销售额达到了244.5亿美元,预计2028年将达到321亿美元
  20. 丁真人设崩塌?吸烟事件后,又爆深夜热聊女网红丨国仁网络

热门文章

  1. 企业云成本管控,你真的做对了吗?
  2. 软件测试工程师面试题汇总
  3. App Extension
  4. python基础入门(变量)
  5. 今日头条面试题,供大家参考
  6. 如何做一名称职的CEO
  7. uni.app H5(微信公众号定位) uni.getLocation
  8. 经典文章:一位营销总监的辞职信及回复
  9. .net ImageProcessor组件转换图片格式
  10. 【论文阅读】[CVPR 2018] PU-Net: Point Cloud Upsampling Network. [tensorflow] [rec. oth.]