使用js实现图片马赛克效果的主要思路是将图片分成小块,然后对小块进行处理,使其变得模糊。实现过程如下:
- 将图片加载到canvas画布中:
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); const img = new Image(); img.src = 'image.jpg'; img.onload = function() { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); }
- 对于每个小块进行处理:
function pixelate(x, y, size) { const imageData = ctx.getImageData(x, y, size, size); const data = imageData.data; const len = data.length; let r = 0, g = 0, b = 0; for (let i = 0; i < len; i += 4) { r += data[i]; g += data[i + 1]; b += data[i + 2]; } r /= (len / 4); g /= (len / 4); b /= (len / 4); for (let i = 0; i < len; i += 4) { data[i] = r; data[i + 1] = g; data[i + 2] = b; } ctx.putImageData(imageData, x, y); }
- 对整个画布进行马赛克处理:
function mosaic(size) { const w = canvas.width; const h = canvas.height; for (let y = 0; y < h; y += size) { for (let x = 0; x < w; x += size) { pixelate(x, y, size); } } }
- 调用mosaic函数,传入块大小即可实现图片马赛克效果。
mosaic(10);
完整的代码如下:
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); const img = new Image(); img.src = 'image.jpg'; img.onload = function() { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); mosaic(10); } function mosaic(size) { const w = canvas.width; const h = canvas.height; function pixelate(x, y, size) { const imageData = ctx.getImageData(x, y, size, size); const data = imageData.data; const len = data.length; let r = 0, g = 0, b = 0; for (let i = 0; i < len; i += 4) { r += data[i]; g += data[i + 1]; b += data[i + 2]; } r /= (len / 4); g /= (len / 4); b /= (len / 4); for (let i = 0; i < len; i += 4) { data[i] = r; data[i + 1] = g; data[i + 2] = b; } ctx.putImageData(imageData, x, y); } for (let y = 0; y < h; y += size) { for (let x = 0; x < w; x += size) { pixelate(x, y, size); } } }