用 cursor 做网站是真的爽

18 天前
 freshgoose

比如说,我想要个 图片分割并 zip 下载 的功能,但是我又不懂 canvas 也不知道浏览器能不能直接打包 zip 。只要告诉它:

生成一个 image splitter 组件,用户上传一张照片,选择行、列数量,点击按钮,就会自动分割,并打包成 zip 格式自动下载。

就会生成一个功能完整的组件:

'use client'
import React, { useState } from 'react';
import JSZip from 'jszip';
import { saveAs } from 'file-saver';

const ImageSplitter = () => {
    const [image, setImage] = useState<File | null>(null);
    const [rows, setRows] = useState(3);
    const [cols, setCols] = useState(3);

    const handleImageUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
        if (e.target.files && e.target.files[0]) {
            setImage(e.target.files[0]);
        }
    };

    const handleSplitImage = async () => {
        if (!image) return;

        const img = new Image();
        img.src = URL.createObjectURL(image);
        img.onload = async () => {
            const canvas = document.createElement('canvas');
            const ctx = canvas.getContext('2d');
            if (!ctx) return;

            const zip = new JSZip();
            const { width, height } = img;
            const pieceWidth = width / cols;
            const pieceHeight = height / rows;

            for (let r = 0; r < rows; r++) {
                for (let c = 0; c < cols; c++) {
                    canvas.width = pieceWidth;
                    canvas.height = pieceHeight;
                    ctx.drawImage(
                        img,
                        c * pieceWidth,
                        r * pieceHeight,
                        pieceWidth,
                        pieceHeight,
                        0,
                        0,
                        pieceWidth,
                        pieceHeight
                    );

                    const dataUrl = canvas.toDataURL('image/png');
                    const base64Data = dataUrl.split(',')[1];
                    zip.file(`piece_${r}_${c}.png`, base64Data, { base64: true });
                }
            }

            const content = await zip.generateAsync({ type: 'blob' });
            saveAs(content, 'image_pieces.zip');
        };
    };

    return (
        <div className="flex flex-col items-center justify-center p-4">
            <div className="bg-white shadow-md rounded-lg p-6 w-full max-w-md">
                <label className="block mb-2">
                    Upload an image:
                    <input
                        type="file"
                        accept="image/*"
                        onChange={handleImageUpload}
                        className="mb-4 w-full p-2 border border-gray-300 rounded"
                    />
                </label>
                <label className="block mb-2">
                    Enter number of rows:
                    <input
                        type="number"
                        value={rows}
                        onChange={(e) => setRows(parseInt(e.target.value))}
                        min="1"
                        className="mb-4 w-full p-2 border border-gray-300 rounded"
                    />
                </label>
                <label className="block mb-2">
                    Enter number of columns:
                    <input
                        type="number"
                        value={cols}
                        onChange={(e) => setCols(parseInt(e.target.value))}
                        min="1"
                        className="mb-4 w-full p-2 border border-gray-300 rounded"
                    />
                </label>
                <button
                    onClick={handleSplitImage}
                    className="w-full bg-blue-500 text-white p-2 rounded hover:bg-blue-600 transition"
                >
                    Split Image
                </button>
            </div>
        </div>
    );
};

export default ImageSplitter;

当然一开始样式有点丑,我补充了一句:使用 tailwind 优化一下样式,要现代感,柔色调

大体效果就出来了: https://imagesplitter.org/

2057 次点击
所在节点    分享发现
6 条回复
Sniper000
18 天前
牛的
MaxChan
18 天前
https://websim.ai/ 试了一下,使用同样的两句话,效果也是很棒。



可以点击下面链接来试玩一下,哈哈 https://websim.ai/c/6aPnf0S5RGnwciIoK
codevvvv9
17 天前
做的好棒啊
codevvvv9
17 天前
// 生成一个 image splitter 组件,用户上传一张照片,选择行、列数量,点击按钮,就会自动分割,并打包成 zip 格式自动下载。

按上面这样操作的吗,然后直接生成代码啦?
freshgoose
17 天前
@codevvvv9 #4 差不多是的,直接生成了可运行的组件
codevvvv9
15 天前
@freshgoose 那这也太强了吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1069729

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX