Skip to content

LeoonLiang/leoon-crop

Repository files navigation

图片裁剪预览工具

🔒 100% 隐私安全 | ⚡ 无需上传 | 🛡️ 本地处理

一个功能强大的图片裁剪和预览工具,专为内容创作者设计。支持快速裁剪图片并实时预览在小红书和朋友圈的展示效果。

所有图片处理完全在浏览器本地进行,不会上传到任何服务器,您的隐私和数据安全得到最大程度的保护。

主界面预览

🔐 隐私与安全

  • 无服务器传输:所有图片处理在您的浏览器本地完成
  • 零数据上传:图片数据永远不会离开您的设备
  • 离线可用:支持 PWA,可安装到桌面离线使用
  • 开源透明:代码完全开源,欢迎审计

✨ 主要功能

📸 智能裁剪

  • 批量上传:支持拖拽或点击上传多张图片
  • 智能裁剪:可以上下左右移动图片,选择最佳裁剪位置
  • 多种比例:预设多种常用裁剪比例
    • 小红书全屏 (3:5)
    • 朋友圈全屏 (9:21)
    • 正方形 (1:1)
    • 横向视频 (16:9)
    • 竖向视频 (9:16)
    • 4:3
    • 自定义比例
  • 裁剪操作:支持旋转、翻转、缩放等操作
  • 批量处理:一次性裁剪多张图片
  • 🔄 旋转适配版型:自动判断图片方向并旋转以适配目标比例,让横图也能完美适配竖屏比例
  • 💬 微信发送优化:一键优化图片用于微信发送
    • 自动将宽度限制在 1080px 以内
    • 智能调整压缩质量,使文件大小接近但不超过 1MB
    • 避免微信二次压缩,保持最佳画质

📱 沉浸式预览

  • 小红书预览:像素级还原小红书 APP 的展示效果

    • 顶部导航栏和状态栏
    • 图片轮播(支持拖拽和滑动)
    • 用户信息区域
    • 点赞评论等交互元素
  • 朋友圈预览:完美还原微信朋友圈

    • 支持 1-9 张图片的九宫格展示
    • 个人信息卡片
    • 朋友圈顶部导航
    • 图片点击全屏查看(带轮播)
  • 多设备支持:可选择不同 iPhone 型号进行预览

    • iPhone 15 Pro Max (430×932)
    • iPhone 15 Pro (393×852)
    • iPhone 14 Pro (393×852)
    • iPhone 13 (390×844)
    • iPhone SE (375×667)
  • 交互体验

    • 📱 全屏预览模式(PC端/移动端)
    • 🔄 屏幕旋转支持(竖屏/左横/右横)
    • 👆 图片轮播(鼠标拖拽/触摸滑动)
    • ⬅️ 返回键关闭全屏(移动端友好)
    • 🎯 点击指示器快速跳转
  • 响应式设计

    • 移动端简洁模式:去除圆角和阴影,宽度 100% 适配
    • 自动等比例缩放,避免内容溢出
    • 支持窗口大小实时调整

💾 便捷导出

  • 单图下载:直接下载单张裁剪后的图片
  • 📦 批量打包:多图自动打包成 ZIP 文件
    • 自动添加序号前缀(1_xxx.jpg, 2_xxx.jpg)
    • 时间戳命名,避免文件覆盖
    • 一键下载,告别重复点击
  • 高质量导出:JPEG 格式,质量 92%
  • 支持格式:JPG、PNG

🚀 快速开始

环境要求

  • Node.js >= 18.0.0
  • npm / pnpm / yarn

安装依赖

# 使用 npm
npm install

# 或使用 pnpm(推荐)
pnpm install

# 或使用 yarn
yarn install

开发环境

启动开发服务器:

npm run dev

访问 http://localhost:3000

局域网访问(手机预览):

# 已配置 host: '0.0.0.0',启动后会显示:
➜ Local:    http://localhost:3000/
➜ Network:  http://192.168.x.x:3000/

在手机浏览器输入 Network 地址即可访问。

生产构建

# 构建生产版本
npm run build

# 预览生产版本
npm run preview

🛠️ 技术栈

  • 框架: Nuxt 3 - Vue 3 全栈框架
  • 语言: TypeScript - 类型安全
  • 样式: Tailwind CSS - 实用优先的 CSS 框架
  • 裁剪: Cropper.js - 强大的图片裁剪库
  • 打包: JSZip - ZIP 文件生成
  • 状态管理: Nuxt useState - 响应式状态管理
  • 包管理: npm / pnpm - 包管理器

📦 项目结构

leoon-crop/
├── assets/           # 静态资源
│   └── css/         # 全局样式
├── components/       # Vue 组件
│   ├── AspectRatioSelector.vue  # 比例选择器
│   ├── CropModal.vue           # 裁剪模态框
│   ├── ImageGrid.vue           # 图片网格
│   ├── ImageUploader.vue       # 图片上传器
│   ├── MomentsPreview.vue      # 朋友圈预览
│   ├── PreviewControls.vue     # 预览控制面板
│   └── XiaohongshuPreview.vue  # 小红书预览
├── composables/      # 组合式函数
│   └── useImageStore.ts        # 图片状态管理
├── types/           # TypeScript 类型定义
│   └── index.ts
├── utils/           # 工具函数
│   ├── constants.ts # 常量配置(设备预设等)
│   └── helpers.ts   # 辅助函数(裁剪、下载、优化等)
├── app.vue          # 主应用组件
├── nuxt.config.ts   # Nuxt 配置
├── tailwind.config.js # Tailwind 配置
└── package.json     # 依赖配置

🎯 使用指南

1. 上传图片

  • 点击上传区域或拖拽图片文件
  • 支持批量上传多张图片
  • 支持 JPG、PNG 等常见格式

2. 选择裁剪比例

  • 从预设比例中选择(小红书、朋友圈等)
  • 或自定义任意比例
  • 比例已针对各平台优化

3. 单图精细裁剪

  • 点击图片卡片上的"编辑裁剪"
  • 拖动调整裁剪区域
  • 支持旋转、翻转、缩放
  • 预览满意后保存

4. 批量智能裁剪

  • 勾选要裁剪的多张图片
  • 选择目标比例
  • 可选功能:
    • 旋转适配版型:自动旋转横图以适配竖屏比例
    • 优化微信发送:限制宽度 1080px,大小 ≤1MB
  • 点击"批量裁剪"一键处理

5. 预览效果

  • 勾选要预览的图片(最多 9 张)
  • 选择预览模式:
    • 📱 小红书:单图轮播展示
    • 💬 朋友圈:1-9 图九宫格
  • 选择设备型号和屏幕方向
  • 点击"全屏预览"获得沉浸体验
  • 支持拖拽切换图片

6. 导出下载

  • 选中一张:直接下载图片
  • 选中多张:自动打包成 ZIP
  • 一键下载到本地

📱 移动端体验

访问方式

  1. 确保电脑和手机在同一局域网
  2. 启动开发服务器,查看 Network 地址
  3. 手机浏览器输入该地址

优化特性

  • 简洁模式:移动端非全屏预览自动去除手机边框装饰
  • 自适应宽度:手机预览宽度 100%,不会超出屏幕
  • 触摸友好:支持滑动切换图片、返回键关闭
  • 性能优化:响应式缩放,流畅不卡顿

🎨 核心技术实现

智能图片裁剪

使用 Canvas API 实现高性能裁剪:

// 1. 居中裁剪算法
// 2. 旋转适配(自动判断横竖图)
// 3. 等比例缩放(限制最大尺寸 4096px)
// 4. 质量控制(JPEG quality 0.92)

微信发送优化

二分查找算法智能调整压缩质量:

// 1. 宽度限制:> 1080px → 缩至 1080px
// 2. 质量优化:二分查找最佳 JPEG 质量
// 3. 目标:文件大小接近但不超过 1MB
// 4. 最多尝试 8 次,找到最优平衡点

响应式预览

Vue 3 响应式系统 + CSS Transform:

// 移动端:
//   - 宽度 100%,使用 aspect-ratio 保持比例
//   - pointer-events 控制点击穿透
// 桌面端/全屏:
//   - transform: scale() 等比例缩放
//   - 动态计算缩放比例以适应屏幕

状态管理

使用 Nuxt 3 的 useState 实现全局响应式状态:

export const useImageStore = () => {
  const images = useState<CropImage[]>('images', () => [])
  const previewMode = useState<PreviewMode | null>('previewMode', () => null)
  const rotation = useState<number>('rotation', () => 0)
  // ... 更多状态
}

🌟 功能亮点

1. 旋转适配版型

智能判断图片方向和目标比例,自动旋转 90° 以获得最佳裁剪效果:

// 示例:
// 横图 (1800×1080) + 竖屏比例 (3:5)
// → 自动旋转 90° → 完美适配

2. 微信发送优化

一键生成微信不压缩的最佳图片:

  • 宽度 ≤ 1080px:避免分辨率损失
  • 大小 ≤ 1MB:避免二次压缩
  • 质量最优:在限制内尽可能保持高质量

3. 批量打包下载

告别重复点击,多图自动打包:

  • 自动添加序号前缀
  • 时间戳命名防覆盖
  • 一次下载全搞定

4. 全屏沉浸预览

PC 和移动端完美体验:

  • Teleport 技术避免 z-index 问题
  • 返回键关闭(移动端友好)
  • 点击背景关闭
  • History API 实现返回功能

📝 依赖说明

核心依赖:

{
  "nuxt": "^3.x",
  "vue": "^3.x",
  "@nuxtjs/tailwindcss": "^6.x",
  "cropperjs": "^1.x",
  "jszip": "^3.x"
}

🤝 贡献指南

欢迎提交 Issue 和 Pull Request!

提交规范

  • feat: 新功能
  • fix: 修复 bug
  • docs: 文档更新
  • style: 代码格式调整
  • refactor: 重构
  • perf: 性能优化

📄 许可证

MIT License

💡 灵感来源

本工具旨在帮助内容创作者:

  • 快速裁剪图片到合适比例
  • 预览发布后的真实效果
  • 提升内容制作效率

🙏 致谢

感谢以下开源项目:

👨‍💻 作者

Made with ❤️ by leoonliang for content creators


如有问题或建议,欢迎提 Issue!

About

一个功能强大的图片裁剪和预览工具,专为内容创作者设计。支持快速裁剪图片并实时预览在小红书和朋友圈的展示效果。

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages