当前位置: 首页 > 后端技术 > Java

用图片分割制作专属表情包?这就是诀窍!

时间:2023-04-01 21:06:17 Java

表情包打架图片,作为一种新的生活乐趣,已经是大多数网友日常聊天互动中必不可少的一部分。捧腹大笑、吃饱肚子、彻底说不出话来……这些千言万语都说不完的情感细节,总能被一个看似普通的表情包完美描述。如今,随着表情包进入白热化阶段,人们对表情包定制的需求越来越大。人人都是表情包的搬运工,人人也是潜力热图的创造者!有必要赋予个人制作个性化表情符号的能力。利用机器学习的图像分割功能,轻松分割复杂图片的背景,让表情包的制作变得简单高效。让我们来看看如何将一张图片变成一个富有表现力的表情包吧!开发准备Maven仓库和SDK配置步骤可以参考开发者网站https://developer.huawei.com/中的应用开发介绍。配置集成SDK包图像分割提供了两种SDK集成方式,一种是分割算法算法包是预先集成在应用程序中,另一种是在应用程序安装运行后,将需要的算法包下载到应用程序中,可以根据应用程序的使用场景和想要的效果来选择。本文是使用FullSDK的集成解决方案。在应用的build.gradle文件中,在dependencies.huawei.hms:ml-computer-中添加图像分割SDK依赖implementation'com.huawei.hms:ml-computer-vision-segmentation:2.2.0.300'implementation'comvision-image-segmentation-body-model:2.2.0.300'配置AndroidManifest.xml打开主文件夹下的AndroidManifest.xml文件,根据场景和使用需要配置读写进入手机存储权限,添加之前在中添加如下语句,当app是安装后,会自动更新最新的机器学习模型到设备开发步骤配置存储权限申请对于手机的存储权限。除了在Manifest中声明,还需要在Activity中动态申请。在MainActivity的onCreate()方法中,调用requestPermission方法申请WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限requestPermissions(EXTERNAL_STORAGE;LITE)……}requestPermission方法的实现如下。首先判断权限。如果未获得许可,请申请。如果已获取,则返回privatevoidrequestPermission(Stringpermissions){if(Build.VERSION.SDK_INTtargetedSize=this.getTargetSize();inttargetWidth=targetedSize.first;inttargetHeight=targetedSize.second;this.originBitmap=BitmapUtils。loadFromPath(StillCutPhotoActivity.this,this.imageUri,targetWidth,targetHeight);然后创建MLFrame并调用asyncAnalyseFrame进行异步图像分割处理MLFramemlFrame=newMLFrame.Creator().setBitmap(this.originBitmap).create();任务task=this.analyzer.asyncAnalyseFrame(mlFrame);图片分割完成后,对返回结果进行处理,将去除背景后的图片保存到processedImagetask.addOnSuccessListener(newOnSuccessListener(){@OverridepublicvoidonSuccess(MLImageSegmentationmlImageSegmentationResults){//分段成功的处理逻辑。如果(mlImageSegmentationResults!=null){StillCutPhotoActivity.this.foreground=mlImageSegmentationResults.getForeground();StillCutPhotoActivity.this.preview.setImageBitmap(StillCutPhotoActivity.this.foreground);StillCutPhotoActivity.this.processedImage=((BitmapDrawable)((ImageView)StillCutPhotoActivity.this.preview).getDrawable()).getBitmap();}else{StillCutPhotoActivity.this.displayFailure();}}}).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(Exceptione){//段失败处理逻辑StillCutPhotoActivity.this.displayFailure();return;}});保存表情包最后处理好的图像转换成png格式,存储到系统相册中publicvoidsaveToAlbum(Bitmapbitmap){Filef文件=空;StringfileName=System.currentTimeMillis()+.png";文件根=新文件(Environment.getExternalStorageDirectory()。getAbsoluteFile(),this.context.getPackageName());Filedir=newFile(root,"图像");if(dir.mkdirs()||dir.isDirectory()){file=newFile(dir,fileName);}FileOutputStreamos=null;尝试{os=newFileOutputStream(文件);位图.compress(Bitmap.CompressFormat.PNG,100,os);os.flush();}catch(FileNotFoundExceptione){Log.e(TAG,e.getMessage());}catch(IOExceptione){Log.e(TAG,e.getMessage());}finally{try{if(os!=null){os.close();}}catch(IOExceptione){Log.e(TAG,e.getMessage());}}如果(文件==null){返回;}if(imageUtilCallBack!=null){try{imageUtilCallBack.callSavePath(file.getCanonicalPath());}抓住(IOExceptione){Log.e(TAG,e.getMessage());}}//画廊刷新。如果(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){Stringpath=null;尝试{path=file.getCanonicalPath();}catch(IOExceptione){Log.e(TAG,e.getMessage());}MediaScannerConnection.scanFile(this.context,newString[]{path},null,newMediaScannerConnection.OnScanCompletedListener(){@OverridepublicvoidonScanCompleted(Stringpath,Uriuri){mediaScanIntent.setData(uri);ImageUtils.this.context.sendBroadcast(mediaScanIntent);}});}else{StringrelationDir=file.getParent();文件file1=新文件(relationDir);this.context.sendBroadcast(newIntent(Intent.ACTION_MEDIA_MOUNTED,Uri.fromFile(file1.getAbsoluteFile())));}}编译运行效果示例后,可以从相册中选择要制作表情的照片,点击剪切。MLKit会完成后续的人像识别和图片分割,去掉杂乱的背景,返回人像的图片,然后点击保存,保存为无背景的表情包。保存后,表情包就可以添加到社交软件中了,快来试试吧!了解更多,请访问华为机器学习图像分割服务官网,获取华为机器学习服务开发指导文档。华为HMSCore官方论坛华为机器学习开源仓库地址:GitHub,Gitee解决集成问题。请第一时间前往StackOverflow点击关注了解。HMSCore的最新技术~