• 解决小程序-wx.canvasGetImageData()-RGB取色盘苹果手机获取颜色慢问题


             简介

            最近做了一个微信小程序控制蓝牙设备,通过小程序中的RGB取色盘,获取当前的RGB颜色,通过蓝牙发送给设备,设备接收到RGB以后,做出相应的调整。

     图1:RGB取色盘

            在安卓手机上运行正常,能够迅速的相应我的手部滑动位置,并获取到颜色,非常的跟手,但是当运行在苹果手机上时,就会非常的卡顿,速度异常的慢。延时极高,是无法接受的。

            我排查过了各种情况,然后我发现wx.canvasGetImageData()这个API,它是获取can with就是那个画布指定位置的颜色的,然后在安卓上就是可以很快的获取到,但是在苹果上它也延迟非常高可得,可能需要一秒多才能够获取到这个东西,这个应该是属于它微信API的问题;

            于是,我在微信的开放社区就是提交这个bug了,一致等待官方给我回复,可是一直没有人回复我。想尽了办法也没有解决这个问题,于是我做十年硬件嵌入式C语言开发的暴脾气上来了,既然微信给的 API不好用,那我就自己写一个函数实现相同的功能就行了啊。

            于是乎我就用到了反正切函数arctan()和勾股定理等,一顿计算,自己编辑出来了一个函数,实现了函数通过触摸点的xy坐标计算获取RGB圆盘的颜色的功能,目前在我的项目中试可用的,可以调整的范围也是挺好的,分享给大家,希望能够帮助大家,同时,有谁有更好的办法大家可以一起交流一下!

    注释:

    x1,x2  :圆心点坐标;

     y1, y2:触摸点位置坐标;

    1. // XY 坐标 转RGB
    2. function xy2rgb(x1, y1, x2, y2) {
    3. // x1=106;
    4. // y1=106;
    5. // x2=86;
    6. // y2=86;
    7. var n = x2 - x1,
    8. s = y1 - y2;
    9. var angle = parseInt(360 * Math.atan(s / n) / (2 * Math.PI));
    10. if (angle < 0) {
    11. angle = 180 + angle;
    12. }
    13. var R_angle = 0;
    14. var B_angle = 0;
    15. var G_angle = 0;
    16. if ((n >= 0) & (s > 0)) {
    17. R_angle = 180 - angle;
    18. B_angle = 180 - (120 - angle);
    19. G_angle = Math.abs(180 - (120 + angle));
    20. }
    21. if ((n < 0) & (s > 0)) {
    22. R_angle = 180 - angle;
    23. B_angle = 180 - Math.abs(120 - angle);
    24. G_angle = Math.abs(180 - (120 + angle));
    25. }
    26. if ((n < 0) & (s <= 0)) {
    27. R_angle = angle;
    28. B_angle = 180 - (60 + angle);
    29. G_angle = 180 - Math.abs(60 - angle);
    30. }
    31. if ((n > 0) & (s < 0)) {
    32. R_angle = angle;
    33. B_angle = Math.abs(180 - (60 + angle));
    34. G_angle = 180 - Math.abs(60 - angle);
    35. }
    36. // console.log("jiaodu",angle);
    37. var radial = parseInt(Math.sqrt(n * n + s * s));
    38. // console.log("zuobiao666888",n,s);
    39. // console.log("banjing",radial,Math.abs(-22));
    40. console.log("B_angle",R_angle,B_angle,G_angle,radial);
    41. if (R_angle < 90) {
    42. var R_colour = parseInt((R_angle / 180) * (1*(x1 - radial) / x1) * 255);
    43. } else {
    44. var R_colour = parseInt((R_angle / 180) * 1*(radial / x1) * 255);
    45. }
    46. if (B_angle < 90) {
    47. var B_colour = parseInt((B_angle / 180) * (1*(x1 - radial) / x1) * 255);
    48. } else {
    49. var B_colour = parseInt((B_angle / 180) * 1*(radial / x1) * 255);
    50. }
    51. if (G_angle < 90) {
    52. var G_colour = parseInt((G_angle / 180) * (1*(x1 - radial) / x1) * 255);
    53. } else {
    54. var G_colour = parseInt((G_angle / 180) * 1*(radial / x1) * 255);
    55. }
    56. if (R_angle > 170) {
    57. R_colour = 255;
    58. // B_colour = 0;
    59. // G_colour = 0;
    60. }
    61. if (G_angle > 170) {
    62. G_colour = 255;
    63. // R_colour = 0;
    64. // B_colour = 0;
    65. }
    66. if (B_angle > 170) {
    67. B_colour = 255;
    68. // R_colour = 0;
    69. // G_colour = 0;
    70. }
    71. if(R_colour >255){
    72. R_colour = 255
    73. }
    74. if(R_colour <0){
    75. R_colour = 0
    76. }
    77. if(B_colour >255){
    78. B_colour = 255
    79. }
    80. if(B_colour <0){
    81. B_colour = 0
    82. }
    83. if(G_colour >255){
    84. G_colour = 255
    85. }
    86. if(G_colour <0){
    87. G_colour = 0
    88. }
    89. // console.log("rgb666",R_colour,B_colour,G_colour);
    90. const RGB_value = [R_colour,G_colour,B_colour]
    91. return RGB_value
    92. }

    微信小程序中js触摸点坐标获取(这部分比较简单,是常规操作)

    1. if (e.touches) {
    2. let x = e.changedTouches[0].x;
    3. let y = e.changedTouches[0].y;
    4. if (e.type !== 'touchend') {
    5. x = e.touches[0].x;
    6. y = e.touches[0].y;
    7. }
    8. let ban=(wx.getSystemInfoSync().windowWidth*0.66/2).toFixed(2);
    9. console.log("let banlet ban 888",ban)
    10. const res = util.xy2rgb(ban, ban, x, y)
    11. if (res[0] == 0 && res[1] == 0 && res[2] == 0) {
    12. return
    13. }
    14. }

    希望能够帮助大家,不要再掉进这个坑里。

  • 相关阅读:
    SQL优化--count优化
    性能测试——App性能测试需要关注的指标
    事务之基本概念
    Java - 浅析 Comparable 和 Comparator
    阿里巴巴面试题- - -Java体系最新面试题(2)
    linux中断下文工作队列之共享工作队列(中断四)
    茂莱光学科创板上市:拟募资4亿 范一与范浩兄弟为实控人
    springcloud 项目扫描不到mybatics的xml文件;
    13-Error接口错误处理以及go Module
    Java注解
  • 原文地址:https://blog.csdn.net/unforgettable2010/article/details/127896220