实践分享:如何在自己的App 中引入AI 画图

这篇具有很好参考价值的文章主要介绍了实践分享:如何在自己的App 中引入AI 画图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近AIGC 简直是杀疯了,领导动不动就让我们在APP 里引入大语言模型,引入AI画图……说搞就搞!本期基于最近在app 里引入AI画图小程序的操作,给大家做一波实践分享。

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

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

实践分享:如何在自己的App 中引入AI 画图

a photo of grassland with cloud(有云朵的草地)

实践分享:如何在自己的App 中引入AI 画图

the sun setting behind the mountains(山后落日)

实践分享:如何在自己的App 中引入AI 画图

A lovely kitten(小猫咪呀)

我发现 Scribble Diffusion 作画的能力非常出乎意料,而且可以根据你的描述来定义不同的照片风格(比如照片,油画,素描等等),于是就产生了把这个AI 画图小程序内嵌到公司App中的想法。另外把小程序内嵌App是通过 FinClip 容器技术实现的。(毕竟开箱即用,也不需要做什么配置)。

实践分享:如何在自己的App 中引入AI 画图

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

  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].x
      this.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].x
      var startY1 = e.changedTouches[0].y

      this.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.prompt
      const 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 的结合有什么奇思妙想,欢迎留言探讨!

当然,如果你对 Scribble Diffusion 有更多奇怪的想法想付诸实践,开发者也已经将项目文件进行了开源,欢迎尝试~文章来源地址https://www.toymoban.com/news/detail-414026.html

到了这里,关于实践分享:如何在自己的App 中引入AI 画图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在自己的uniapp项目中引入uni-id-pages

    uni-id-pages,是uni-id体系的一部分。 它基于uni-id-common提供了一批现成的、开源的、登录注册账户管理相关的前端页面和云端云对象。 它是一个云端一体页面组的uni_modules,含前端页面和后端云对象(uni-id-co)。 开发者在项目中引入uni-id-pages,账户管理的功能无需自己再开发。

    2024年02月09日
    浏览(25)
  • 【uni-app项目如何引入 uView组件库】

    uView官方文档 第一步: 在公司创建完成uniapp项目后引入uView 第二步: 您如果是使用HBuilder X创建的uniapp项目,使用uView组件库的话需要在HBuilder X下载插件库 下载 uni_modules ,(如果这个看不懂可以看官方文档) (1) HBuilder X插件库中下载 uni_modules 现在是已经将 uView导入到项目中了

    2024年02月05日
    浏览(41)
  • 安卓APP引入第三方SDK如何做安全检测?

    最近听说好多App都被下架处理了,隐私合规管理特别严格。隔壁王老板公司旗下的一款App就被通报了,说是嵌入的第三方SDK违规收集用户个人信息。 还记得,在2021年的315晚会,上海、北京有几家公司都被报道,其SDK均在未经用户授权,窃取用户个人信息。涉案App有 50多款,

    2024年02月05日
    浏览(31)
  • ai绘画工具哪些好?分享三个好用的ai绘画app给你

    现在让我为你带来一场关于ai绘画的奇妙冒险吧!在这个神奇的世界里,人工智能成为了创作的好伙伴,带给我们前所未有的绘画体验!ai绘画通过分析数百种经典作品的元素和技巧,以及对色彩、笔触和光影的理解,为你提供灵感和指导。它会在你的画布上自动调整色彩的层

    2024年02月14日
    浏览(42)
  • AI文本创作在百度App发文的实践

    作者 | 内容生态端团队 导读 大语言模型(LLM)指包含数百亿(或更多)参数的语言模型,这些模型通常在大规模数据集上进行训练,以提高其性能和泛化能力。在内容创作工具接入文心一言AI能力后,可以为用户提供更加智能化、个性化的服务,帮助作者降低创作难度和创作

    2024年02月09日
    浏览(30)
  • 换脸ai的方法分享!这几个换脸APP巨好用。​

    换脸ai的方法分享!换脸AI是一种基于人工智能技术的图像处理应用,它可以将一个人的面部特征和表情应用到另一张照片或视频中,实现快速、高效的人脸替换。这种技术利用机器学习模型分析和学习大量的人脸数据,训练出一种“生成对抗网络”(GAN)模型,通过对待处理

    2024年02月12日
    浏览(33)
  • ai绘画生成软件app有哪些?今天跟你分享三款ai绘画生成软件

    在数字化时代,人工智能正在以惊人的速度渗透到各个领域。绘画艺术也不例外。如今,有许多令人兴奋的ai绘画工具问世,它们为艺术家、设计师和创意爱好者带来了新的创作体验。这些工具不仅能够帮助你实现创作上的突破,还能为你的艺术之旅增添乐趣。 喜欢这些美丽

    2024年02月14日
    浏览(37)
  • 如何搭建自己的AI绘画平台

    官方地址:https://github.com/AUTOMATIC1111/stable-diffusion-webui 芯片:Apple M1 Pro 内存:16G 安装虚拟环境,我用的anaconda安装,注意python版本需要3.10以上,每次启动记得先激活一下虚拟环境 anaconda下载地址:Anaconda | The World\\\'s Most Popular Data Science Platform 安装过程比较漫长,需要充github上

    2024年02月01日
    浏览(39)
  • AI时代如何提升自己晋升力

    要在AI时代提升职场晋升力,采取以下详细策略: 终身学习的实践: 专业课程: 定期参加在线课程或研讨会,如Coursera、edX等,学习最新的AI技术和行业动态。 行业资讯: 订阅相关的行业杂志、博客,了解最新趋势。 学位或证书: 完成相关的学位或证书课程,比如数据科学

    2024年02月04日
    浏览(35)
  • 保姆级教程!教你打造自己的AI孙燕姿;全程使用AI工具设计一款桌游;搭建基于LLM的客服系统的实践 | ShowMeAI日报

    👀 日报周刊合集 | 🎡 生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 王咏刚,创新工场CTO,技术撰稿人,有数个知名出版作品。他结合自己在AI领域投资、深度孵化和创业的丰富经验,分享了自己对AI技术最新应用场景的思考。 第一部分围绕GPT等通用大语言模型,

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包