0

微信小程序开发:异步处理接入的生成式图像卡通化 - 一方_self

 6 months ago
source link: https://www.cnblogs.com/shuinanxun/p/18076377
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

微信小程序开发:异步处理接入的生成式图像卡通化

书接上文,我们完成了对接阿里云人像动漫化接口,现已完成的界面是这样的:

0c8e5e13b4ad4bc89fa4de7c2471f5a0~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=hb%2B3aMSPaGDynoE8xV%2BINajL%2B0A%3D

就是效果看着一般,看看效果:

c3de571907754c7babd6ab320bebd7ce~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=%2FzblGn%2Btcj9okVimKpRiVfyHjos%3D

然后我就在阿里云api市场转悠,就想看看还有没有什么其他奇奇怪怪的api,结果就发现了这个:

api链接这里:
https://help.aliyun.com/zh/viapi/api-generative-image-cartoon

faef8894d37c4a8d9cbfe15430c94d7e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=gPH242rZ3HXoXcxd8xpcw6GfMQY%3D

看看这个效果,完全是之前的不能比的啊:

314ef679160d4df180a9d6baa409779a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=1Qi75JgfFNz9sTirKr0wQ6bE6Mc%3D
072e5cb3689f4c539b59bc6ab7e5eae3~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=eMxrtLjA43f0B1AejLbz34tWNZM%3D

果断想到接入自己的小程序里,SDK调试链接:
https://next.api.aliyun.com/api/imageenhan/2019-09-30/GenerateCartoonizedImage?sdkStyle=old

d5de30fff1234e3bbb96a1cd920dc8b8~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=FkBhi6kAF0HQOk1hWWw0wWe3fa8%3D

它是一个异步任务,提交请求后会返回一个RequestId,我们需要拿这个RequestId去另一个接口拿到处理结果,可能需要等个8秒左右才有结果,因为处理需要耗时:
调试链接:
https://next.api.aliyun.com/api/imageenhan/2019-09-30/GetAsyncJobResult?sdkStyle=old

3911278d928a4fc2858b3bb3b987d53e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=owcxefGZC8N6m0wmW%2B%2FKW2HaHmU%3D

大家也可以按我上面的方法使用。

看看它的SDK写法:

fbb8d76898c34fbe8ed41c106a6f81d0~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=dfOjURoYVdc%2BwZ9i1Y%2F2jhtllj8%3D

就两个参数,一个图片链接、一个风格效果,在之前的配置上我们增加一个生成式图形卡通化的风格配置:

1372cbe71ca64bf7b01c33d0e7f999bf~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=htHA2xFMPBWl9Js4su4lMPC9kKY%3D

接下来先让它显示到界面上,因为我们之前已经有了一些风格选择,所以之前的风格选择我们要做成组件形式,不然会代码重复:

46483b96d7274cd392db336116120d9b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=ZG6lovYQXL%2FgQf7nOpRhuHNWJVE%3D

风格选择组件就这些简单HTML结构,我们在页面引用:

ce65382177d44ca7b234d7f4888fcf50~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=qrAnMgaAotP87ENJmqkRobSH2Sg%3D

这里有两个风格列表,和两个风格的索引还有不同风格的点击事件,先看看页面呈现效果:

1ea5deb08a2f41fca7e0056635b73455~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=JrJKschN3K9sN%2BW3xV5bjtJGi1U%3D

就是这样一个上下排列的结构。

我们这里只允许上下只能点击一个风格,就比如我们点了上面的3D特效,那么下面就不能选中,同理,选择了下面的风格,上面之前选中的就失焦了:

ceb6d62a429a4e3eb71c3a8086219773~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=g51Q0D14VWfWP7uU4%2BBP80z0vuw%3D

如何实现这个效果呢?上面的既不能选择第一个也就是原图、也不能上下两行风格同时选择。

首先第一个,只需要在点击时判断是否为0即可,为0则跳过,否则设置当前索引为点击时的索引:

69e2b1f4f2814168bec9dc8990f995a9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=bkh7I%2Bc8gS2GaKxhvOFbPad96t8%3D

可以看到我这里有一个设置为null的操作,这是因为设置为null以后某一条就不会选中任何风格了:

514face7232440668cfc81bf1c8befbd~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=cEgTLAKePT8%2BAgEZY5L0rJfluJE%3D

这里的style_select_index允许为null类型,否则设置null时,style_select_index就只能为0了,因为这是Number类型的默认值为0。

处理好了风格选择后,开始处理提交事件,点击上面一排风格时走原先的人像动漫化接口,如果点击的是下面一排风格,那么就得走生成式图像卡通化接口。

我们先把生成式图像卡通化接口接进来:

5248a75daf6d418e93cc8f2250564e9d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=WIUx9fuJgGWTUNLgAEGydJ52qbs%3D

接口挺简单的,传入图片和风格类型即可。

再在选择第二排风格时做走生成式图像卡通化接口的逻辑:

57501a770a7d40e595d95be53bf78cbf~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=57ApojI3mccsbgCLQFtXzIqIZrY%3D

这里我判断的逻辑是:如果为选中人像动漫化那一排的风格,那么就肯定选中了生成式图像卡通化风格。

这里的逻辑是先调用异步任务创建阿里云任务,再将阿里云创建的任务放到我本地创建的一个队列中,再去轮询阿里云任务处理的结果。

让我们看看代码,先创建异步任务、再将异步任务添加到本地队列:

75face63d4794f38bd8a3a95144126e1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=YauUk7JpLxS5m7xgHt3%2FxToiHt8%3D

本地队列追加的逻辑:

1ac46ad8f60b49a2a163e8d63b6fc93d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=j%2F95OQutZ5k6XLQuvJ%2BjvBSQtlU%3D

然后再起一个定时任务去轮询定时任务状态:

a22ffd37baa741428cf2e16200766aee~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=XYs5Q9F3Q6rLUSvX4MkG8Mh06jc%3D

先while去检查本地队列是否存在任务,如果没有任务则继续下次轮询判断,如果本地队列存在任务,则从头部弹出一个任务,并向阿里云查询异步任务结果:

caea2673eb8f41d59e0ca1dcd986000c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=t%2FyhIOhAPZ7540d1d0A%2B1iwNQFY%3D

大概流程就是如上↑。

我们实际提交一个任务看看,当为异步任务时,我会将追加到列表的上传任务的状态设为loading,意为上传中:

ec0c41d4b64e420f99a177d245eec899~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=jcxkJ0r%2BO8hYjCb3oiafAxi%2FCt0%3D

因为定时任务一直在跑,所以队列有内容时就会开始处理了:

e8753efbbb7448febe526e59eca995f7~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=58rPlUP%2FpChbR6XBr6gedjtJXLw%3D

第一排的特效每次返回基本都差不多,但是第二排的特效有些返回都是不一样的,我比较喜欢这个炫彩卡通的,因为它每次都返回不一样的图片:

851f7b586f334a4a99803e8e3780e543~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=DV68PV7DztOAVoybyGeQFA4H7cs%3D

小程序名:《一方云知》。首页就是人像动漫化功能,欢迎大家使用。

小程序二维码:

738b5337fd0444bb96fd982a361ba880~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1711116896&x-signature=LgcKp7yBgquuMmxsrwW7I2xn2VA%3D

这篇文章就到这里啦!如果你对文章内容有疑问或想要深入讨论,欢迎在评论区留言,我会尽力回答。同时,如果你觉得这篇文章对你有帮助,不妨点个赞并分享给其他同学,让更多人受益。

想要了解更多相关知识,可以查看我以往的文章,其中有许多精彩内容。记得关注我,获取及时更新,我们可以一起学习、讨论技术,共同进步。

感谢你的阅读与支持,期待在未来的文章中与你再次相遇!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK