获取与设置像素

Canvas获取与设置像素详解,掌握像素颜色读取、颜色拾取器、像素绘制等实用技巧。通过像素操作可以实现颜色拾取、像素级绘图等功能。

获取单个像素

function getPixel(ctx, x, y) {
  const imageData = ctx.getImageData(x, y, 1, 1)
  const data = imageData.data
  
  return {
    r: data[0],
    g: data[1],
    b: data[2],
    a: data[3]
  }
}

设置单个像素

function setPixel(ctx, x, y, r, g, b, a = 255) {
  const imageData = ctx.createImageData(1, 1)
  imageData.data[0] = r
  imageData.data[1] = g
  imageData.data[2] = b
  imageData.data[3] = a
  ctx.putImageData(imageData, x, y)
}

颜色拾取演示

颜色拾取器

批量获取像素

function getPixels(ctx, x, y, width, height) {
  const imageData = ctx.getImageData(x, y, width, height)
  const data = imageData.data
  const pixels = []
  
  for (let i = 0; i < data.length; i += 4) {
    pixels.push({
      r: data[i],
      g: data[i + 1],
      b: data[i + 2],
      a: data[i + 3]
    })
  }
  
  return pixels
}

批量设置像素

function setPixels(ctx, x, y, width, height, pixels) {
  const imageData = ctx.createImageData(width, height)
  const data = imageData.data
  
  pixels.forEach((pixel, i) => {
    const index = i * 4
    data[index] = pixel.r
    data[index + 1] = pixel.g
    data[index + 2] = pixel.b
    data[index + 3] = pixel.a !== undefined ? pixel.a : 255
  })
  
  ctx.putImageData(imageData, x, y)
}

像素绘制工具

像素绘制画板

RGB转HEX

function rgbToHex(r, g, b) {
  const toHex = (n) => {
    const hex = n.toString(16)
    return hex.length === 1 ? '0' + hex : hex
  }
  return '#' + toHex(r) + toHex(g) + toHex(b)
}

// 使用示例
const color = getPixel(ctx, 50, 50)
const hex = rgbToHex(color.r, color.g, color.b)
console.log(hex)  // #e74c3c

HEX转RGB

function hexToRgb(hex) {
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null
}

// 使用示例
const rgb = hexToRgb('#e74c3c')
console.log(rgb)  // { r: 231, g: 76, b: 60 }

颜色转换演示

颜色格式转换

像素比较

function comparePixels(pixel1, pixel2, tolerance = 0) {
  return Math.abs(pixel1.r - pixel2.r) <= tolerance &&
         Math.abs(pixel1.g - pixel2.g) <= tolerance &&
         Math.abs(pixel1.b - pixel2.b) <= tolerance
}

注意事项

性能考虑

频繁获取单个像素效率低,应批量获取。

跨域限制

跨域图像无法获取像素数据。

坐标范围

确保坐标在画布范围内。