wallpaper.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. // pages/piano/wallpaper/wallpaper.js
  2. const { deviceWallPaper } = require('../../../request/deviceListRequest')
  3. // const sharp = require('sharp');
  4. // const fs = require('fs');
  5. const {
  6. BtHelper
  7. } = require('../../../devices/bt_helper');
  8. const { BtCmd } = require('../../../devices/bluetooth/bt_cmd');
  9. import EventManager from '../../../utils/event_bus'
  10. import { EnumCmdEvent, CmdEvent } from '../../../devices/cmd_key_event';
  11. // import EventManager from '../../utils/event_bus'
  12. Page({
  13. /**
  14. * 页面的初始数据
  15. */
  16. data: {
  17. topImg:
  18. {
  19. // pic: "",
  20. // id: "",
  21. // name: ""
  22. },
  23. imageList: [
  24. ],
  25. selectIndex: 0,
  26. navbarData: {
  27. showCapsule: 1, //是否显示左上角图标 1表示显示 0表示不显示
  28. title: '壁纸设置', //导航栏 中间的标题
  29. callback() {
  30. if (this._imageBuffer) {
  31. wx.showModal({
  32. title: '保存图片中,确定要中断退出吗?',
  33. content: '',
  34. complete: (res) => {
  35. if (res.cancel) {
  36. }
  37. if (res.confirm) {
  38. BtHelper.getInstance().endImage(0)
  39. }
  40. }
  41. })
  42. } else {
  43. wx.navigateBack({
  44. delta: 1,
  45. })
  46. }
  47. }
  48. },
  49. src: '',
  50. showProgress: false,
  51. width: 250,//宽度
  52. height: 250,//高度
  53. _imageBuffer: null,
  54. progressPercent: 0,
  55. _timer: null,
  56. },
  57. closePage() {
  58. },
  59. footerTap() {
  60. const that = this;
  61. wx.chooseMedia({
  62. count: 1,
  63. mediaType: ['image'],
  64. sourceType: ['album'],
  65. // camera: 'back',
  66. success(res) {
  67. console.log(res.tempFiles[0].tempFilePath)
  68. console.log(res.tempFiles[0].size)
  69. // that.setData({
  70. // imageSrc: res.tempFiles[0].tempFilePath, // 图片路径
  71. // showCrop: true
  72. // })
  73. // wx.editImage({
  74. // src: res.tempFiles[0].tempFilePath, // 图片路径
  75. // })
  76. wx.getImageInfo({
  77. src: res.tempFiles[0].tempFilePath,
  78. success(res) {
  79. console.log(res)
  80. wx.cropImage({
  81. src: res.path,// 图片路径
  82. cropScale: '1:1', // 裁剪比例
  83. success(res) {
  84. console.log(res)
  85. }
  86. })
  87. }
  88. })
  89. }
  90. })
  91. },
  92. async convertToRGB565(inputPath, outputPath) {
  93. try {
  94. // todo
  95. let sharp = null
  96. const metadata = await sharp(inputPath).metadata();
  97. const { width, height } = metadata;
  98. const buffer = await sharp(inputPath)
  99. .raw()
  100. .toBuffer();
  101. const outputBuffer = Buffer.alloc(width * height * 2); // 2 bytes per pixel for RGB565
  102. for (let y = 0; y < height; y++) {
  103. for (let x = 0; x < width; x++) {
  104. const index = (y * width + x) * 4; // RGBA
  105. const r = buffer[index];
  106. const g = buffer[index + 1];
  107. const b = buffer[index + 2];
  108. const r5 = (r >> 3) & 0x1F; // 5 bits for red
  109. const g6 = (g >> 2) & 0x3F; // 6 bits for green
  110. const b5 = (b >> 3) & 0x1F; // 5 bits for blue
  111. const rgb565 = (r5 << 11) | (g6 << 5) | b5;
  112. const outputIndex = (y * width + x) * 2;
  113. outputBuffer[outputIndex] = (rgb565 >> 8) & 0xFF; // High byte
  114. outputBuffer[outputIndex + 1] = rgb565 & 0xFF; // Low byte
  115. }
  116. }
  117. _this.data._imageBuffer = outputBuffer;
  118. _this.startImage()
  119. // fs.writeFileSync(outputPath, outputBuffer);
  120. console.log(`Conversion successful: ${outputPath}`);
  121. } catch (error) {
  122. console.error('Error converting image:', error);
  123. }
  124. },
  125. imageTap(e) {
  126. // console.log(e)
  127. // wxfile://tmp_d3e57489ead39c698676ff860df9cb8a37f66ee1a4777dbb.jpg
  128. let image = e.currentTarget.dataset.image;
  129. _this.setData({
  130. topImg: image ?? {}
  131. })
  132. }, wallpaperList() {
  133. let _this = this;
  134. deviceWallPaper().then(res => {
  135. console.log("壁纸列表", res);
  136. let data = res.data ?? []
  137. if (data.length == 0) {
  138. _this.setData({
  139. imageList: [],
  140. topImg: {},
  141. })
  142. return;
  143. }
  144. topImg = data[0];
  145. _this.setData({
  146. imageList: data ?? [],
  147. topImg: data[0] ?? {}
  148. })
  149. })
  150. },
  151. hideCut(e) {
  152. const img = arguments[0].detail
  153. if (img && img.path) {
  154. console.log("裁剪图片:", img)
  155. }
  156. this.setData({
  157. imageSrc: "",//要裁剪的图片
  158. showCrop: false
  159. })
  160. },
  161. startImage() {
  162. BtHelper.sendData(BtCmd.wallPaper(1));
  163. },
  164. sendImage(imageBuffer) {
  165. let chunkSize = 20;
  166. let _this = this
  167. _this.setData({
  168. progress: 0,
  169. progressPercent: 0
  170. });
  171. for (let i = 0; i < imageBuffer.length; i += chunkSize) {
  172. const chunk = imageBuffer.slice(i, i + chunkSize);
  173. BtHelper.wallPaperData(chunk)
  174. }
  175. },
  176. endImage() {
  177. BtHelper.sendData(BtCmd.wallPaper(0));
  178. },
  179. startProgress() {
  180. let _this = this;
  181. this.setData({
  182. showProgress: true
  183. })
  184. // 定时器,每100毫秒执行一次
  185. let progress = 0;
  186. _this._timer = setInterval(function () {
  187. if (progress >= 100) {
  188. clearInterval(_this._timer); // 停止定时器
  189. _this.setData({
  190. progress: 0,
  191. progressPercent: 0,
  192. showProgress: false,
  193. });
  194. wx.showToast({
  195. title: '图片上传成功',
  196. })
  197. } else {
  198. progress += 1; // 每次增加1%
  199. _this.setData({
  200. progress:progress,
  201. progressPercent: progress
  202. });
  203. }
  204. }, 100);
  205. },
  206. /**
  207. * 生命周期函数--监听页面加载
  208. */
  209. onLoad(options) {
  210. let param = JSON.parse(options.param)
  211. console.log(param)
  212. this.wallpaperList();
  213. let _this = this;
  214. EventManager.addNotification(CmdEvent.eventName, function (event) {
  215. let name = event.cmdEvent;
  216. console.log("壁纸页:", event)
  217. switch (name) {
  218. case EnumCmdEvent.wallPaper:
  219. let otaCmd = event.wallPaper;
  220. let kind = event.kind;
  221. if (otaCmd === 1 && kind == 1) {
  222. // 开始发送
  223. _this.sendImage()
  224. } else if (otaCmd === 0 && kind == 1) {
  225. // 发送结束
  226. _this.endEnd()
  227. }
  228. break;
  229. }
  230. }, this)
  231. },
  232. /**
  233. * 生命周期函数--监听页面初次渲染完成
  234. */
  235. onReady() {
  236. },
  237. /**
  238. * 生命周期函数--监听页面显示
  239. */
  240. onShow() {
  241. },
  242. /**
  243. * 生命周期函数--监听页面隐藏
  244. */
  245. onHide() {
  246. },
  247. /**
  248. * 生命周期函数--监听页面卸载
  249. */
  250. onUnload() {
  251. EventManager.removeNotification(CmdEvent.eventName, this);
  252. },
  253. /**
  254. * 页面相关事件处理函数--监听用户下拉动作
  255. */
  256. onPullDownRefresh() {
  257. },
  258. /**
  259. * 页面上拉触底事件的处理函数
  260. */
  261. onReachBottom() {
  262. },
  263. /**
  264. * 用户点击右上角分享
  265. */
  266. onShareAppMessage() {
  267. }
  268. })