微信小程序根据图片生成背景颜色有效果图

效果图


取得是图片中间10个像素算出背景颜色

.wxml

复制代码
<canvas type="2d" id="imageCanvas" style="--w: {{w}}px;--h: {{h}}px;" />
<view style="background: {{backgroundColor}};">
  <image bind:tap="updateIndex" data-index="{{index}}" wx:for="{{image}}" 
  wx:key="index" src="{{item}}" mode="aspectFill" style="{{select === index?'border:2px solid red;':''}}" />
</view>

.wxss

复制代码
canvas{
  visibility: hidden;
  position: absolute;
  z-index: -1;
  width: var(--w);
  height: var(--h);
  left: var(--w);
  top: calc(var(--w) * -1);
}
view{
  height: 100vh;
  text-align: center;
  transition: all 0.5s;
}
image{
  width:300rpx;
  height:300rpx;
  margin: 30rpx 30rpx 0;
  box-sizing: border-box;
}

.js

复制代码
Page({
  data:{
    w:0,
    h:0,
    image:[
      'https://c-ssl.dtstatic.com/uploads/blog/202402/27/1mS1Nve5iQqnQpN.thumb.400_0.jpg',
      'https://c-ssl.dtstatic.com/uploads/blog/202402/23/aLS3821yt0BE1yW.thumb.400_0.jpeg',
      'https://c-ssl.dtstatic.com/uploads/blog/202402/25/lGSgwXVEhxOzbqx.thumb.400_0.jpeg',
      'https://c-ssl.dtstatic.com/uploads/blog/202402/27/lGS1anBpixO7xG3.thumb.400_0.jpg',
    ],
    select:0
  },
  onLoad(options) {
    this.getColor()
  },
  updateIndex(e){
    this.setData({
      select:e.currentTarget.dataset.index
    })
    this.getColor()
  },
  getColor(){
    var that = this
    const src = that.data.image[that.data.select]
    that.getImageData(src, pixels => {
      const mainColor = that.MainColor(pixels);
      that.setData({
        backgroundColor: `rgb(${mainColor[0]}, ${mainColor[1]}, ${mainColor[2]})`,
      });
    });
  },
  getImageData(src, fn) {
    var that = this
    wx.getImageInfo({
      src,
      success(res) {
        const { width, height } = res;
        that.setData({
          w:width,
          h:height
        })
        wx.createSelectorQuery().select('#imageCanvas').fields({ node: true, size: true }).exec((rect) => {
          const canvas = rect[0].node
          const ctx = canvas.getContext('2d')
          canvas.width = width
          canvas.height = height
          const image = canvas.createImage()
          image.src = src
          image.onload = () => {
            ctx.drawImage(image,0,0,width,height)
            const x = (width - 10) / 2 | 0,y = (height - 10) / 2 | 0
            const o = ctx.getImageData(x, y, 10, 10)
            fn(o.data);
          };
        })
      },
    });
  },
  MainColor(pixels) {
    const colorFrequency = {};
    for (let i = 0; i < pixels.length; i += 4) {
      const red = pixels[i];
      const green = pixels[i + 1];
      const blue = pixels[i + 2];
      const key = `${red},${green},${blue}`;
      if (!colorFrequency[key]) {
        colorFrequency[key] = 0;
      }
      colorFrequency[key]++;
    }
    let mainColor = '';
    let maxCount = 0;
    Object.keys(colorFrequency).forEach(key => {
      if (colorFrequency[key] > maxCount) {
        maxCount = colorFrequency[key];
        mainColor = key.split(',').map(Number);
      }
    });
    return mainColor;
  },
})

遇到问题可以看我主页加我Q,很少看博客,对你有帮助别忘记点赞收藏。

相关推荐
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
拖孩3 天前
代码我能全交给 AI,流量主这 500 个访客它一个都替不了我
前端·后端·微信小程序
甜到心里的蛋糕3 天前
如何用企业微信实现让微信收到通知实时通知
服务器·python·微信小程序·fastapi
2601_963870203 天前
基于springboot的综合网上购物商场系统
微信小程序·小程序·课程设计
2601_963869954 天前
力序健身房管理系统
微信小程序·小程序
拖孩4 天前
给小程序加「一键发公众号贴图」,我把 wx.shareToOfficialAccount 的三个坑趟了一遍
前端·后端·微信小程序
StevenLdh5 天前
第四期 · 云端同步与冲突仲裁:离线可写、多端一致的工程解法
java·微信小程序
m0_462803885 天前
会议签到如何设置手写签名?从创建签到到导出签名 PDF 的完整流程
微信小程序
AI工具人PM产品经理6 天前
零基础微信小程序入门:一个真实项目的里程碑路线图
微信小程序·云开发·学习路线·零基础入门·ai 编程
拖孩7 天前
这个小程序是 AI 帮我写的,可它里面一个 AI 功能都没有
前端·后端·微信小程序