翼度科技»论坛 编程开发 JavaScript 查看内容

uni-app 实现轮播图组件父容器背景色随图片主题色改变

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
uni-app 实现轮播图组件父容器背景色随图片主题色改变

实现思路

1、获取轮播图主题色,通过 canvas 获取图片主题色。
2、随着轮播图组件图片的轮播,动态设置父容器背景色为图片的主题色。
实现代码
  1. <template>
  2.   <view >
  3.     <canvas
  4.       canvas-id="getThemeColorCanvas"
  5.       id="getThemeColorCanvas"
  6.       
  7.     >
  8.     </canvas>
  9.     <view
  10.       
  11.       :
  12.     >
  13.       <view
  14.         
  15.         
  16.       >
  17.         <view  >
  18.           <u-swiper
  19.             :list="swiperList"
  20.             keyName="url"
  21.             @change="handleUSwiperChange"
  22.             @click="handleUSwiperClick"
  23.           >
  24.           </u-swiper>
  25.         </view>
  26.       </view>
  27.     </view>
  28.   </view>
  29. </template>
复制代码
轮播图组件用的 uView 2.x 的 u-swiper 组件。
  1. // @/utils/index.js
  2. /**
  3. * 获取图片主题色
  4. * @param path
  5. * 图片的路径,可以是相对路径,临时文件路径,存储文件路径,网络图片路径
  6. * @param canvasId
  7. * 画布表示
  8. * @param callback
  9. * 回调函数,返回图片主题色的 RGB 颜色值
  10. */
  11. export function getImageThemeColor(path, canvasId, callback) {
  12.   uni.getImageInfo({
  13.     src: path,
  14.     success: function (img) {
  15.       // 创建一个 Canvas 对象
  16.       const ctx = uni.createCanvasContext(canvasId);
  17.       // 将图片绘制到 Canvas 上
  18.       const imgWidth = 300;
  19.       const imgHeight = 150;
  20.       ctx.drawImage(img.path, 0, 0, imgWidth, imgHeight);
  21.       ctx.save();
  22.       ctx.draw(true, () => {
  23.         uni.canvasGetImageData({
  24.           canvasId: canvasId,
  25.           x: 0,
  26.           y: 0,
  27.           width: imgWidth,
  28.           height: imgHeight,
  29.           success(res) {
  30.             let data = res.data;
  31.             let arr = [];
  32.             let r = 1,
  33.               g = 1,
  34.               b = 1;
  35.             // 取所有像素的平均值
  36.             for (let row = 0; row < imgHeight; row++) {
  37.               for (let col = 0; col < imgWidth; col++) {
  38.                 if (row == 0) {
  39.                   r += data[imgWidth * row + col];
  40.                   g += data[imgWidth * row + col + 1];
  41.                   b += data[imgWidth * row + col + 2];
  42.                   arr.push([r, g, b]);
  43.                 } else {
  44.                   r += data[(imgWidth * row + col) * 4];
  45.                   g += data[(imgWidth * row + col) * 4 + 1];
  46.                   b += data[(imgWidth * row + col) * 4 + 2];
  47.                   arr.push([r, g, b]);
  48.                 }
  49.               }
  50.             }
  51.             // 求取平均值
  52.             r /= imgWidth * imgHeight;
  53.             g /= imgWidth * imgHeight;
  54.             b /= imgWidth * imgHeight;
  55.             // 将最终的值取整
  56.             r = Math.round(r);
  57.             g = Math.round(g);
  58.             b = Math.round(b);
  59.             if (!!callback) {
  60.               // 返回图片主题色的 RGB 颜色值
  61.               callback(`${r},${g},${b}`);
  62.             }
  63.           },
  64.         });
  65.       });
  66.     },
  67.   });
  68. }
复制代码
实现效果



来源:https://www.cnblogs.com/yuzhihui/p/17223004.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具