fabricjs中因mac retina屏幕像素比导致的捕捉canvas像素不准确

背景

问题的起因是某项目中实现一个光标指向canvas后,捕捉当前鼠标位置色值的功能。功能完成后部分用户出现色值偏差,如图:

分析

fabricjs初始化canvas时,enableRetinaScalling默认开启,致使canvas getImageData()坐标错位,

问题解决:

修改前:

javascript 复制代码
/**
 * 获取canvas背景图中指定像素色值
 * @param canvas canvas参数为new fabric.Canvas()实例
 * @param x 鼠标x坐标位置
 * @param y 鼠标y坐标位置
 * @returns 当前鼠标所在像素的色值
 */
function getColorAtPosition(canvas, x, y) {
  var canvasElement = canvas.getElement()
  var context = canvasElement.getContext('2d')
  let newX = x * canvas.backgroundImage.scaleX
  let newY = y * canvas.backgroundImage.scaleY
  var pixel = context.getImageData(newX, newY, 1, 1).data
  const color = new fabric.Color(`rgba(${pixel.join(',')})`)
  return {
    array: pixel,
    rgba: `rgba(${pixel.join(',')})`,
    hex: `#${color.toHex()}`
  }
}

为保证当前坐标在不同屏幕下都可以正常捕捉,需要乘以屏幕像素比的比例,window.devicePixelRatio

修改后:

javascript 复制代码
// 获取canvas背景图中指定像素色值
function getColorAtPosition(canvas, x, y) {
  var canvasElement = canvas.getElement()
  var context = canvasElement.getContext('2d')
  // 注:retina屏幕下需要乘以当前设备的devicePixelRatio值 
  let newX = x * canvas.backgroundImage.scaleX * window.devicePixelRatio
  let newY = y * canvas.backgroundImage.scaleY * window.devicePixelRatio
  var pixel = context.getImageData(newX, newY, 1, 1).data
  const color = new fabric.Color(`rgba(${pixel.join(',')})`)
  return {
    array: pixel,
    rgba: `rgba(${pixel.join(',')})`,
    hex: `#${color.toHex()}`
  }
}

可以根据不同屏幕像素比,计算在canvas图像中相应的准确坐标。

相关推荐
boleixiongdi几秒前
# Bsin-App Uni:面向未来的跨端开发框架深度解析
前端
G等你下课4 分钟前
AJAX请求跨域问题
前端·javascript·http
前端西瓜哥4 分钟前
pixijs 的填充渲染错误,如何处理?
前端
snakeshe10105 分钟前
6-1. 实现 useState
前端
呆呆没有脑袋7 分钟前
深入浅出 JavaScript 闭包:从核心概念到框架实践
前端
snakeshe10108 分钟前
用100行代码实现React useState钩子:多状态管理揭秘
前端
爱编程的喵8 分钟前
JavaScript闭包深度解析:从作用域到实战应用
前端·javascript
ITfeib10 分钟前
Flutter
开发语言·javascript·flutter
雪碧聊技术1 小时前
深入解析Vue中v-model的双向绑定实现原理
前端·javascript·vue.js·v-model
快起来别睡了1 小时前
手写 Ajax 与 Promise:从底层原理到实际应用
前端