Scribble Diffusion 是一个简单的在线服务,它使用 AI 将粗略的草图转换为精致的图像,每一张图像都是不同的(而且没有版权困扰)。简单来说,我们只需要「用画笔描绘一张草图,在输入描述后稍等片刻」,随后就会为你生成一幅画。这幅画可以多次生成,每次生成的结果也都大不相同。

Scribble Diffusion 的能力大概是这样的(左边是我画的,右边是 TA 画的)




我发现 Scribble Diffusion 作画的能力非常出乎意料,而且可以根据你的描述来定义不同的照片风格(比如照片,油画,素描等等),于是就产生了搬运到 FinClip 中作为小程序的想法了(毕竟开箱即用,也不需要做什么配置)。

调研官网之后发现官网中的元素非常简单,正因如此,我觉得把「Scribble Diffusion」搬运到 FinClip 小程序里大概要分这样几步:

  1. 使用 canvas 实现画板,能够在小程序中进行绘画;
  2. 提供输入框与生成按钮,能够补充图片的描述和生成的按钮;
  3. 获取生成的图片链接进行展示

使用小程序实现画板

我们可以使用小程序来实现一个画板,使用 canvas 标签实现画笔功能。用户可以在画板上绘制画作,也可以选择清空画板操作。

下面是一个示例代码:

<!--画布区域-->
<view class="canvas_area"><canvas id="myCanvas" canvas-id="myCanvas" class="myCanvas"disable-scroll="false"bindtouchstart="touchStart"bindtouchmove="touchMove"bindtouchend="touchEnd"></canvas>
</view>
<view class="clearBtn" bindtap="reset">清空画板
</view>
Page({data: {isProcessing: false,prompt: '',scribble: null,pen : 2, //画笔粗细默认值color : '#000000', // 画笔颜色默认值result: null,text: ''},startX: 0, //保存X坐标轴变量startY: 0, //保存X坐标轴变量onLoad(params) {wx.createSelectorQuery().select('#myCanvas').context((res) => {this.context = res.context}).exec()},//手指触摸动作开始touchStart: function (e) {//得到触摸点的坐标this.startX = e.changedTouches[0].xthis.startY = e.changedTouches[0].y// this.context = wx.createContext()this.context.setStrokeStyle(this.data.color)this.context.setLineWidth(this.data.pen)this.context.setLineCap('round') // 让线条圆润 this.context.beginPath()},//手指触摸后移动touchMove: function (e) {var startX1 = e.changedTouches[0].xvar startY1 = e.changedTouches[0].ythis.context.moveTo(this.startX, this.startY)this.context.lineTo(startX1, startY1)this.context.stroke()this.startX = startX1;this.startY = startY1;//只是一个记录方法调用的容器,用于生成记录绘制行为的actions数组。context跟<canvas/>不存在对应关系,一个context生成画布的绘制动作数组可以应用于多个<canvas/>wx.drawCanvas({canvasId: 'myCanvas',reserve: true,actions: this.context.getActions() // 获取绘图动作数组})},//手指触摸动作结束touchEnd: function () {var imageData =  wx.canvasGetImageData({canvasId: 'myCanvas',height: 250,width: 250,x: 0,y: 0,success(res){return res.data}})},//清除画板reset: function(){this.context.clearRect(0, 0, 400, 400);this.context.draw(true)}
})

提供输入框和生成按钮

我们需要提供一个 input 输入框,供用户输入 prompt;同时,我们需要提供一个按钮,点击时会触发响应事件,将 canvas 内容生成图片,同时将 prompt 输入作为参数,提交给服务端进行图片生成。

这里是示例代码:

<!-- 输入框 -->
<view class="imageDes"> <view class="formInput"> <input class="input" type="text" name="go"  placeholder="用关键词描述画的内容" bindinput="update"/></view>
</view>
Page({... 省略上述代码// 更新表单提交按钮状态update(e){this.setData({prompt : e.detail.value})},
})

获取生成的图片链接并展示

当用户点击生成图片按钮后,我们会将 canvas 内容和用户输入的 prompt 作为参数提交给服务端进行图片生成。服务端会返回生成的图片链接,我们需要将它展示给用户。

在下面的示例代码中,我们服务端发送 POST 请求,然后解析返回的 JSON 数据,获取图片链接,并将其添加到页面中。用户就可以看到生成的图片了。

<!-- 绘图结果 -->
<view class="result" wx:if="{{result}}"><view class="resultBox"><view class="content"><image class="content" src="{{result}}" mode="aspectFit" /> </view><view class="download"><view class="btn" bindtap="download">下载</view></view></view>
</view>
Page({... 省略上述代码async getCanvasImage() {return new Promise((resolve, reject) => {wx.canvasToTempFilePath({x: 0,y: 0,width: 250,height: 250,destWidth: 250,destHeight: 250,canvasId: 'myCanvas',success(res) {console.log(res.tempFilePath)resolve(res.tempFilePath)},fail(err) {console.log(err)}})})},async upload(image) {return new Promise((resolve) => {wx.uploadFile({url: 'xxxxxx',filePath: image,name: 'file',success (res){const data = JSON.parse(res.data)resolve(data.url)},fail(err){console.log('上传失败')console.log(err)}})})},async sleep(time) {return new Promise((resolve) => {setTimeout(() => {resolve()}, time)})},async handleSubmit(e) {if (!this.data.prompt) {return}wx.showLoading({title: '生成中',})try {const prompt = this.data.promptconst image = await this.getCanvasImage()this.setData({error: null,isProcessing: true});const url = await this.upload(image)console.log('图片', url)const body = {prompt: prompt,image: url,};const response = await my_fetch.fetch( {url: "https://scribblediffusion.com/api/predictions",method: "POST",headers: {"Content-Type": "application/json",},params: JSON.stringify(body),});let prediction = response.data;console.log('预测', prediction)if (response.statusCode !== 201) {wx.showToast({title: '生成失败',duration: 2000})this.setData({error: '生成失败'});return;}while (prediction.status !== "succeeded" &&prediction.status !== "failed") {console.log(prediction.status)await this.sleep(500);const response = await my_fetch.fetch({url:"https://scribblediffusion.com/api/predictions/" + prediction.id,});prediction = response.data;if (response.statusCode !== 200) {this.setData({error: prediction.detail});return;}}if (Array.isArray(prediction.output) && prediction.output.length > 1) {wx.hideLoading()this.setData({isProcessing: false,result: prediction.output[1]});} else {wx.hideLoading()wx.showToast({title: '生成失败',duration: 2000})this.setData({isProcessing: false,error: '生成失败'})} } catch (error) {wx.hideLoading()console.log(error)wx.showToast({title: '生成失败',duration: 2000}) }},
})

生成完小程序之后,再通过 FinClip 上传小程序就可以在 App 获得画板功能啦!我把这个小程序上传到了「FinClip 小程序应用市场」中,可以扫描下方的二维码随意体验,总的来说,还是挺好玩的。

如何把Ai绘画工具放到我们的App中相关推荐

  1. 200+的AI绘画工具你值得拥有

    200+的AI绘画工具你值得拥有 文章目录 AI 绘画(图片) AI 绘画(设计) AI 绘画(艺术创作) AI 绘画(头像和个人资料图片) AI 绘画(图片艺术生成) AI 绘画(图片编辑) AI ...

  2. 在哪里尝试爆火的AI绘画?16款AI绘画工具大盘点!

    要说今年什么最火,一定是AI绘画.AI绘画在人工智能领域中大放异彩,彻底火了. 随着各种开放代码和模型出现,国内外各种AI工具开始争奇斗艳,今天就来给大家盘点一下国内外AI绘画工具有哪些?其中那家生成 ...

  3. AI绘画工具软件网站合集:这些人工智能绘画生成器效果太赞了

    那么有哪些口碑比较高的文本转图片的AI绘图软件呢?本文将跟大家分享一波出图效果相当不错的人工智能绘画工具网站,让大家实现"绘画自由". 一.Disco Diffusion 简介:这 ...

  4. Ai绘画工具有哪些?推荐这7款效果惊艳的AI绘画神器

    2022虽然不是ai绘图这项技术诞生的时间,但却是到目前为止最爆火出圈的绘图元年. AI绘图(AI painting)就是以文生图(text2image),属于跨模态生成(Cross-modal ge ...

  5. ai绘画有哪些软件,盘点三款免费且超级好用的AI绘画工具

    Ai绘画有哪些软件?不但可以免费使用,而且生成的画作精美,而且生成的图片速度还要很快? 不用急,今天小编给大家推荐的这三款ai绘画工具完全满足了上述条件! 第一款,重磅级产品,数画 数画是一款国内ai ...

  6. 超级全面的 AI 绘画工具合集

    最近,AI绘画在国内突然火起来了.从今年7月份到现在,短短几个月时间,国内也涌现了一批AI绘画工具.今天推荐的这个项目是「awesome-ai-painting」,作者做了一个汇总,整理成 AI 绘画 ...

  7. 如何将AI模型集成到android应用(app)中

    在Android中集成AI模型(Tensorflow,caffe,coreml) 该开发指南可以指导Android手机应用开发者将常见深度学习框架(Caffe.Tensorflow.Coreml.Pa ...

  8. 这18个被全网吹爆了的AI绘画工具,分享给你!

    伴随着ChatGPT的横空出世,一场史无前例的科技革命正在拉开序幕. AI 拥有强大的信息储备和数据处理能力,无论是速度.质量,还是思维模式,都让人只呼不得了!写代码.造论文丝毫不在话下,甚至还能和你 ...

  9. 你知道AI绘画工具都有哪些吗?

    你知道AI绘画工具都有哪些吗?AI绘画是一种新兴的绘画技术,通过人工智能技术来实现自动生成艺术作品. 现在有很多支持AI绘画功能的软件,下面介绍三款比较知名的软件,并附上具体的操作步骤. 软件一.一键 ...

最新文章

  1. Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
  2. equals()方法详解
  3. iView 实现可编辑表格
  4. VTK:隐式函数之SampleFunction
  5. 4个数字,如何最快找到最小的2个数
  6. python求平均值函数_Python两个练习题,写出私信有奖
  7. 【每日算法Day 91】求解数组中出现次数超过1/3的那个数
  8. 阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例
  9. 五寸照片尺寸是多少?如何自己制作证件照?
  10. 移动互联网浩荡十年 有的升腾,有的陨落
  11. UG GC工具箱中的齿轮与弹簧
  12. 【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(1)-霍尔编码器移植
  13. 求Kinetics400,AVA,prcv2018,Moments in time challenge2018,youtube8M,ActivityNet数据集,原始视频
  14. 乐蜂网八周年店庆有感
  15. 项目管理中的技术风险
  16. 红色性格和蓝色性格的优缺点
  17. mycat 分表分库
  18. IS-IS LSP泛洪同步过程
  19. IBM x系列服务器光通路诊断灯错误解释
  20. 医院lis系统需要服务器吗,医院里的HIS系统和LIS系统有什么区别?

热门文章

  1. SQL 简介以及MySQL的优点
  2. 集成开发faceunitySDK
  3. luogu 题解 P1217 【[USACO1.5]回文质数 Prime Palindromes】
  4. 计算广告——introduction
  5. Android音乐播放器---实现Notification控制音乐播放
  6. typescript 之 keyof
  7. 高斯拉普拉斯——图像金字塔
  8. 虾皮面试真题:虾皮后端15连问!
  9. Descriptors cannot not be created directly
  10. php生成word文件