Canvas 圖片顏色轉換

圖片顏色轉換, 意思就如字面上所說, 可以將我們在畫布Canvas上的顏色進行轉換。
就像有些圖片App那樣, 可以把顏色加強對比、增加飽和、灰階效果等等

由於工作上的需要, 這次需要將幾張圖片結合近一張畫布Canvas接著將其反白。
實作方式並不困難,考慮以下程式範例以及註解:

// 建立畫布
let canvas = document.createElement('canvas')
// 取得Context
let ctx = canvas.getContext('2d')
// 設定畫布大小
let canvasSize = 300
// 取得裝置 devicePixelRatio
let devicePixelRatio = window.devicePixelRatio || 1
// 取得裝置 BackingStorePixelRatio
let backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1
// 取得畫布實際大小比值
let ratio = (devicePixelRatio / backingStoreRatio)
// 設定畫布樣式寬高
canvas.style.width = canvas.style.height = `${canvasSize}px`
// 設定畫布實際寬高
canvas.width = canvas.height = canvasSize * ratio
// 修正畫布內容大小
ctx.scale(ratio, ratio)

// 以上內容為修正失真, 接著載入範例圖片
let image = new Image()
image.addEventListener('load', () => {
  
  ctx.drawImage(image, 0, 0)
  
  document.body.appendChild(canvas)
  
  // 本主題範例重點由此開始
  
  // 建立反白圖片物件
  let antiWhiteImage = new Image()
  
  // 取得原畫布圖像資料
  antiWhiteImage = ctx.getImageData(0, 0, canvas.width, canvas.height)
  
  let red, green, blue, alpha, convertColor
  // 注意這邊的迴圈變數i, 每次為 i+=4
  for (let i = 0; i < antiWhiteImage.data.length; i += 4) {
    // i = red 0~255
    red = antiWhiteImage.data[i]
    // i+1 = green 0~255
    green = antiWhiteImage.data[i + 1]
    // i+2 = blue 0~255
    blue = antiWhiteImage.data[i + 2]
    // i+3 = alpha 0~255
    alpha = antiWhiteImage.data[i + 3]

    // 轉換所有非白色的顏色至白色, 其他則轉為黑色
    convertColor = (red + green + blue) > 0 ? 255 : 0
    antiWhiteImage.data[i]      = convertColor
    antiWhiteImage.data[i + 1]  = convertColor
    antiWhiteImage.data[i + 2]  = convertColor
    antiWhiteImage.data[i + 3]  = 255
  }
  
  
  // 宣告畫布2
  let canvas2 = document.createElement('canvas')
  // 取得畫布2, Context
  let ctx2 = canvas2.getContext('2d')
  
  // 設定畫布2樣式寬高
  canvas2.style.width = canvas2.style.height = `${canvasSize}px`
  // 設定畫布2實際寬高
  canvas2.width = canvas2.height = canvasSize * ratio
  
  ctx2.putImageData(antiWhiteImage, 0, 0);
  document.body.appendChild(canvas2)
})
image.src = 'http://reso2.yiihuu.com/530647-z.jpg'

此範例邏輯正確, 但實際執行此範例會遇到Canvas跨域問題因此目前無法繪出圖二

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,452评论 3赞 49
  • iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本i...
    Sam_Lau阅读 38,535评论 17赞 235
  • 今天的画有点小难度,小伙伴们依然轻松拿下,太棒啦! 小伙伴的作品来啦: 当天依然在外面,木有上颜色,对于我来说这幅...
    今天很幸福阅读 469评论 0赞 0
  • 最后一个进入车厢的,是一个老人。 在杨箕地铁站,大概是二零一四年十月二十二日十九点五十五分二十九秒。 头发银白,黄...
    非有先生阅读 606评论 1赞 3
  • 萨特南镇的风越来越大了,似乎是因为夏天来的缘故,炙热的气浪一阵阵的洗刷着过路的每一个行人,那些流落街头的无家可...
    永随阅读 552评论 0赞 0

友情链接更多精彩内容