实现图片上传功能,通过 FileReader 预览图片: const input = document.createElem…">
当前位置:首页 > JavaScript

js 实现图片功能

2026-04-04 05:05:47JavaScript

图片上传与预览

使用 <input type="file"> 实现图片上传功能,通过 FileReader 预览图片:

const input = document.createElement('input');
input.type = 'file';
input.accept = 'image/*';

input.addEventListener('change', (e) => {
  const file = e.target.files[0];
  const reader = new FileReader();

  reader.onload = (event) => {
    const img = document.createElement('img');
    img.src = event.target.result;
    document.body.appendChild(img);
  };

  reader.readAsDataURL(file);
});

document.body.appendChild(input);

图片压缩

利用 canvas 实现客户端图片压缩:

function compressImage(file, quality = 0.8) {
  return new Promise((resolve) => {
    const img = new Image();
    img.src = URL.createObjectURL(file);

    img.onload = () => {
      const canvas = document.createElement('canvas');
      canvas.width = img.width;
      canvas.height = img.height;

      const ctx = canvas.getContext('2d');
      ctx.drawImage(img, 0, 0);

      canvas.toBlob((blob) => {
        resolve(blob);
      }, 'image/jpeg', quality);
    };
  });
}

图片懒加载

通过 IntersectionObserver 实现图片懒加载:

const lazyImages = document.querySelectorAll('img[data-src]');

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
});

lazyImages.forEach(img => observer.observe(img));

图片裁剪

使用 cropper.js 库实现图片裁剪功能:

js 实现图片功能

import Cropper from 'cropperjs';

const image = document.getElementById('image');
const cropper = new Cropper(image, {
  aspectRatio: 16 / 9,
  crop(event) {
    console.log(event.detail.x, event.detail.y);
  }
});

// 获取裁剪结果
const croppedCanvas = cropper.getCroppedCanvas();

图片滤镜效果

通过 CSS filter 属性实现基础滤镜:

function applyFilter(element, filterType) {
  const filters = {
    grayscale: 'grayscale(100%)',
    sepia: 'sepia(100%)',
    blur: 'blur(5px)',
    invert: 'invert(100%)'
  };
  element.style.filter = filters[filterType] || 'none';
}

图片下载

canvas 内容导出为图片文件:

js 实现图片功能

function downloadImage(canvas, filename = 'image.png') {
  const link = document.createElement('a');
  link.download = filename;
  link.href = canvas.toDataURL('image/png');
  link.click();
}

图片拖拽上传

实现拖拽区域接收图片文件:

const dropArea = document.getElementById('drop-area');

dropArea.addEventListener('dragover', (e) => {
  e.preventDefault();
  dropArea.classList.add('dragover');
});

dropArea.addEventListener('drop', (e) => {
  e.preventDefault();
  dropArea.classList.remove('dragover');

  const files = e.dataTransfer.files;
  if (files.length) handleImageUpload(files[0]);
});

图片 EXIF 信息读取

使用 exif-js 库读取图片元数据:

import EXIF from 'exif-js';

function readExif(file) {
  return new Promise((resolve) => {
    EXIF.getData(file, function() {
      resolve(EXIF.getAllTags(this));
    });
  });
}

图片像素操作

通过 canvas 获取和修改像素数据:

function processPixels(canvas) {
  const ctx = canvas.getContext('2d');
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data;

  for (let i = 0; i < data.length; i += 4) {
    const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
    data[i] = data[i + 1] = data[i + 2] = avg;
  }

  ctx.putImageData(imageData, 0, 0);
}

标签: 功能图片
分享给朋友:

相关文章

vue实现ping功能

vue实现ping功能

实现Ping功能的思路 在Vue中实现Ping功能通常需要借助浏览器API或后端服务。由于浏览器环境限制,无法直接发送ICMP请求(传统Ping协议),但可通过以下两种方式模拟: HTTP请求模拟P…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

vue实现图片

vue实现图片

Vue 实现图片展示的方法 在 Vue 中实现图片展示可以通过多种方式完成,以下是一些常见的方法: 使用 img 标签直接引入 通过 img 标签的 src 属性直接引入本地或远程图片: <…

vue电影功能实现

vue电影功能实现

Vue 电影功能实现 数据获取与展示 使用 Axios 或 Fetch API 从电影 API(如 TMDb、豆瓣 API)获取数据。在 Vue 的 created 或 mounted 生命周期钩子中…

react如何添加图片

react如何添加图片

在React中添加图片的方法 使用import导入本地图片 将图片文件放在项目目录中(如src/assets),通过import语句引入后作为src属性值: import logo from './…