好玩,花 5 分钟写个图片生成代码神器,附上完整源码!

职场   2024-12-06 11:27   福建  

前几天分享过一个开源项目 screenshot-to-code ,这个项目主要功能是利用人工智能技术将屏幕截图转换为前端网页代码的工具。

它可以将设计截图直接转化为 HTML、CSS 或 JavaScript 代码,这样能帮助开发者快速生成网页前端代码。
GitHub 项目地址为:https://github.com/abi/screenshot-to-code
官方网站地址为:https://screenshottocode.com/
这几天突发奇想,尝试自己写一个这样的功能,而且现在很多国内大模型都有接口可以来实现这样的功能,比如 GLM-4V-Plus 就是一个集图像理解与视频理解能力于一体的多模态模型,我们就利用它这个强大的能力,把一个图片、设计稿或者网页截图直接转化为 HTML、CSS 或 JavaScript 代码,这样能帮助开发者快速生成前端代码。
先来看下我实现的效果,基本的功能已经完成实现了:
我把这个代码复制出来在浏览器中查看,效果如下:
不能说很像,只能说一毛一样了~~~
接下来直接上源代码了,有兴趣的可以尝试下:
先安装下智谱的 Python SDK 库,当然也可以其他的语言,官方文档都有提供详细说明,我这采用的是 Python:
pip install zhipuai
服务端采用 FastAPI 来实现文件读取和 API 的请求功能,安装 FastAPI 和 Uvicorn:
pip install fastapi uvicorn
前端采用的是 SSE 调用,所以还要安装一个专门用于处理 Server-Sent Events (SSE) 的库:
 pip install sse-starlette
在代码中导入 EventSourceResponse: 
 from sse_starlette.sse import EventSourceResponse

前端部分需要引入的第三库库 CDN 如下:
<link rel="stylesheet" href="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/twitter-bootstrap/4.6.1/css/bootstrap.min.css"><script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/2.0.3/jquery.min.js"></script><script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/marked/4.0.2/marked.min.js"></script><style>
前端 HTML 代码使用 bootstrap4 来实现:
<header class="bg-info text-white text-center py-3">    <h1>AI 图片解析</h1></header>
<div class="container-fluid"> <div class="row"> <div class="col-md-6 py-4"> <h4>上传图片</h4> <div id="upload-area" class="upload-area"> <p>拖放图片到此处,或点击上传</p> </div> <input type="file" id="file-input" hidden accept="image/*"> <div id="file-list" class="mt-3"></div> </div> <div class="col-md-6 bg-light py-4"> <h4>AI 解析选项</h4> <!-- 点击解析按钮 --> <button id="parse-btn" class="btn btn-warning btn-block mb-3 btn-lg" disabled>开始解析</button> <div id="output"></div> </div>
</div></div>
<footer class="bg-light text-center py-3"> <p>&copy; 2024 AI 图片解析平台</p></footer>
CSS 代码如下:
.upload-area {    border: 2px dashed #cce5ff;    border-radius: 5px;    padding: 60px;    font-size:48px;    text-align: center;    color: #6c757d;    cursor: pointer;}
.upload-area.drag-over { background-color: #e9ecef; border-color: #cce5ff;}
前端 JS 代码部分(需要使用第三库 jQuery 和 markedjs,markedjs 用来解析 markdown 格式的输出):
$(document).ready(function() {    let base64Data = null; // 当前图片的 Base64 数据
// 转换文件为 Base64 function toBase64(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(file); }); }
// 处理图片文件 async function handleFiles(files) { for (const file of files) { if (file.type.startsWith('image/')) { base64Data = await toBase64(file);
// 显示图片预览 const img = $('<img class="img-fluid">').attr('src', base64Data); $('#file-list').append(img);
// 启用解析按钮 $('#parse-btn').prop('disabled', false); } else { alert('仅支持上传图片文件!'); } } }
// 点击“解析”按钮时触发 $('#parse-btn').click(async function () { if (!base64Data) { alert('请先上传图片'); return; }
$('#output').html('');
// 通过 EventSource 发送图片数据 const eventSource = new EventSource(`/start-parsing?image=${encodeURIComponent(base64Data)}`); let _htmlContent = ''; eventSource.onmessage = function (event) { const data = JSON.parse(event.data); const content = data.content; if (content === "[DONE]") { eventSource.close(); console.log("Stream completed."); } else { _htmlContent += content; // 逐步更新内容 } $('#output').html(marked.parse(_htmlContent)); }; });
// 拖动和点击事件 $('#upload-area').click(function () { $('#file-input').click(); });
$('#upload-area').on('dragover', function (e) { e.preventDefault(); $(this).addClass('drag-over'); });
$('#upload-area').on('dragleave', function () { $(this).removeClass('drag-over'); });
$('#upload-area').on('drop', function (e) { e.preventDefault(); $(this).removeClass('drag-over'); handleFiles(e.originalEvent.dataTransfer.files); });
$('#file-input').change(function () { handleFiles(this.files); });});
后端部分源代码:
@app.get("/start-parsing")async def start_parsing(request: Request):    img_base = request.query_params.get('image')       client = ZhipuAI(api_key=apiKey)    """    接收图片的 Base64 数据并解析    """    response = client.chat.completions.create(        model="glm-4v-plus",  # 填写需要调用的模型名称            messages=[            {                "role": "user",                "content": [                {                    "type": "image_url",                    "image_url": {                        "url": img_base                    }                },                {                    "type": "text",                    "text": "使用 bootstrap 生成一个跟他一摸一样网页代码,只需要输出代码即可。"                }                ]            }        ]    )
# 生成器:逐步输出流式数据 async def event_stream(): for chunk in response: delta_content = response.choices[0].message.content if delta_content: yield f"{json.dumps({'content': delta_content})}" #yield "data: [DONE]\n\n" # 结束标志 yield f"{json.dumps({'content': '[DONE]'})}"# 结束标志 return EventSourceResponse(event_stream())

用的智谱 SDK 需要到官方平台去申请 APIKey。
 AI 开放平台:https://bigmodel.cn?utm_source=2&utm_campaign=yrgzh&_channel_track_key=qY2wSfNO
👇点击「阅读原文」,申请 APIKey!👇

菜鸟教程
学的不仅是技术,更是梦想!
 最新文章