基于截图页面生成前端项目

前两天,在群里看见一个视频,视频中,作者截图twitter首页,然后使用截图直接生成与截图布局非常相近的前端项目,效果还是比较惊艳的。

今天陪老婆回老家,路上clone这个项目的代码到本地,学习了一下,整体还是很直观的。

项目github:https://github.com/abi/screenshot-to-code

进入项目,就可以看见它的README.md中给出的效果,因为视频号放视频很麻烦,就截图示意一下。

0c032b7453b539408fb04c1f6c4d4c60.png

本文主要是学习一下作者是怎么实现截图到相似布局这个核心功能的,当然看完后,我也学到一些其他编程技巧,一同记录一下。

截图到布局的核心逻辑

一句话总结:使用gpt-4-vision-preview识别图片并配合提示词,直接让GPT4生成相应的HTML代码。

项目分为frontend和backend,frontend最核心的就是将你的截图转成base64字符串然后通过websocket发送给backend接口。

frontend是react+tailwindcss来开发的,海外很多人都用这套(我现在也用这套为主),核心代码如下:

// src/generateCode.ts

// 生成代码
export function generateCode(
  params: CodeGenerationParams,
  onChange: (chunk: string) => void,
  onSetCode: (code: string) => void,
  onStatusUpdate: (status: string) => void,
  onComplete: () => void
) {
  const wsUrl = `${WS_BACKEND_URL}/generate-code`;
  console.log("Connecting to backend @ ", wsUrl);

  // 实例化 websocket 对象
  const ws = new WebSocket(wsUrl);

  // 建立 websocket 连接
  ws.addEventListener("open", () => {
    ws.send(JSON.stringify(params));
  });

  // 接受 websocket 信息
  ws.addEventListener("message", async (event: MessageEvent) => {
    const response = JSON.parse(event.data);
    if (response.type === "chunk") {
      onChange(response.value);
    } else if (response.type === "status") {
      onStatusUpdate(response.value);
    } else if (response.type === "setCode") {
      // 接受到后端生成的代码,设置到setCode变量中(setCode会被实时展示出来)
      onSetCode(response.value);
    } else if (response.type === "error") {
      console.error("Error generating code", response.value);
      toast.error(response.value);
    }
  });
  
 // websocket 关闭
  ws.addEventListener("close", (event) => {
    console.log("Connection closed", event.code, event.reason);
    if (event.code != 1000) {
      console.error("WebSocket error code", event);
      toast.error(ERROR_MESSAGE);
    } else {
      onComplete();
    }
  });

  ws.addEventListener("error", (error) => {
    console.error("WebSocket error", error);
    toast.error(ERROR_MESSAGE);
  });
}

backend使用fastapi构建的,通过@app.websocket("/generate-code")就可以构建出支持websocket的api接口了,非常方便。

当backend收到图片的base64后,会使用gpt-4-vision来进行代码生成,vision相关的用法请自行看文档:https://platform.openai.com/docs/guides/vision

在这个项目中,提示词如下:

def assemble_prompt(image_data_url):
    return [
        {"role": "system", "content": SYSTEM_PROMPT},
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url": image_data_url, "detail": "high"},
                },
                {
                    "type": "text",
                    "text": USER_PROMPT,
                },
            ],
        },
    ]

其中,比较关键是SYSTEM_PROMPT,内容如下:

You are an expert Tailwind developer
You take screenshots of a reference web page from the user, and then build single page apps 
using Tailwind, HTML and JS.
You might also be given a screenshot of a web page that you have already built, and asked to
update it to look more like the reference image.

- Make sure the app looks exactly like the screenshot.
- Pay close attention to background color, text color, font size, font family, 
padding, margin, border, etc. Match the colors and sizes exactly.
- Use the exact text from the screenshot.
- Do not add comments in the code such as "<!-- Add other navigation links as needed -->" and "<!-- ... other news items ... -->" in place of writing the full code. WRITE THE FULL CODE.
- Repeat elements as needed to match the screenshot. For example, if there are 15 items, the code should have 15 items. DO NOT LEAVE comments like "<!-- Repeat for each news item -->" or bad things will happen.
- For images, use placeholder images from https://placehold.co and include a detailed description of the image in the alt text so that an image generation AI can generate the image later.

In terms of libraries,

- Use this script to include Tailwind: <script src="https://cdn.tailwindcss.com"></script>
- You can use Google Fonts
- Font Awesome for icons: <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"></link>

Return only the full code in <html></html> tags.
Do not include markdown "```" or "```html" at the start or end.

这个提示词让GPT4成为Tailwind developer,然后通过用户提供的screenshots去生成代码,使用tailwind、HTML、JS来生成页面,然后强调了样式细节要尽量与图片相同,最后说了,如果要用Tailwind,需要引入的cdn url等。

就这个提示词,就可以生成图片了。

当然,这里还有一个技巧,就是页面中,需要有图片资源的地方,使用了https://placehold.co服务,我看这个服务,是专门用于展示默认图片的。

90c64122402760ff0f8a054b9a6cc78f.png

生成完code后,就通过BeautifulSoup将生成code中的img都提取出来,基于img中的alt作为新的提示词,使用DALL3去生成相关的图片,相关代码如下:

async def generate_image(prompt, api_key):
    client = AsyncOpenAI(api_key=api_key)
    image_params = {
        "model": "dall-e-3",
        "quality": "standard",
        "style": "natural",
        "n": 1,
        "size": "1024x1024",
        "prompt": prompt,
    }
    res = await client.images.generate(**image_params)
    return res.data[0].url

因为整个过程需要一定的时间,所以使用了websocket.send_json方法将进行在哪一步实时发送给frontend,从而让用户感知到程序还在正常执行。

await websocket.send_json({"type": "setCode", "value": updated_html})
await websocket.send_json(
    {"type": "status", "value": "Code generation complete."}
)

结尾

以上就是项目的核心了,只能说OPENAI的GPT4确实功能强大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/163597.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测

回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测 目录 回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测&#xff08;…

Bert学习笔记(简单入门版)

目 录 一、基础架构 二、输入部分 三、预训练&#xff1a;MLMNSP 3.1 MLM&#xff1a;掩码语言模型 3.1.1 mask模型缺点 3.1.2 mask的概率问题 3.1.3 mask代码实践 3.2 NSP 四、如何微调Bert 五、如何提升BERT下游任务表现 5.1 一般做法 5.2 如何在相同领域数据中进…

037、目标检测-算法速览

之——常用算法速览 目录 之——常用算法速览 杂谈 正文 1.区域卷积神经网络 - R-CNN 2.单发多框检测SSD&#xff0c;single shot detection 3.yolo 杂谈 快速过一下目标检测的各类算法。 正文 1.区域卷积神经网络 - R-CNN region_based CNN&#xff0c;奠基性的工作。…

[C++历练之路]vector的介绍以及底层模拟实现

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; &#x1f354;前言&#xff1a; 我们学习了STL中的string以及其所有重要接口并进行了模拟实现&#xff0c;但是STL中包含的内容不止于此。学习了string之后继续学习STL中的vector&#xff0c;学习成本会大大降低&#…

CentOS7 安装mysql8(离线安装)postgresql14(在线安装)

注&#xff1a;linux系统为vmware虚拟机&#xff0c;和真实工作环境可能有出入&#xff0c;不过正因如此我暴露了NAT转出的IP也没什么大碍 引言 postgresql与mysql目前都是非常受人欢迎的两大数据库&#xff0c;其各有各的优势&#xff0c;初学者先使用简单一张图来说明两者区…

【算法挨揍日记】day31——673. 最长递增子序列的个数、646. 最长数对链

673. 最长递增子序列的个数 673. 最长递增子序列的个数 题目解析&#xff1a; 给定一个未排序的整数数组 nums &#xff0c; 返回最长递增子序列的个数 。 注意 这个数列必须是 严格 递增的。 解题思路&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 先尝试…

取数游戏2(动态规划java)

取数游戏2 题目描述 给定两个长度为n的整数列A和B&#xff0c;每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax&#xff0c;则第i次取走的数的价值vibi⋅ax&#xff0c;现在希望你求出∑vi的最大值。 输入格式 第一行一个数T &#xff0c;表示有T 组数据。…

【算法挨揍日记】day27——152. 乘积最大子数组、1567. 乘积为正数的最长子数组长度

152. 乘积最大子数组 152. 乘积最大子数组 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整…

【狂神说Java】Docker概述 | Docker安装 | Docker的常用命令

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;【狂神说Java】 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c…

PS学习笔记——视图调整

文章目录 图片拖动图片旋转图片缩放 视图只是我们在对图片进行操作时所看到的图片状态&#xff0c;并不会实际改变图片的属性。目的是方便我们在操作图片时有最舒服的体验 图片拖动 工具栏中有这样一个抓手工具(快捷键H)&#xff0c;选择这个抓手工具便可以在图片放大后能用鼠标…

2023年四川省安全员A证证模拟考试题库及四川省安全员A证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年四川省安全员A证证模拟考试题库及四川省安全员A证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;四川省安全员A证证模拟考试题库是根据四川省安全员A证最新版教材&#xff0c;四川省安全员A证大纲整理…

BGP联盟和团体属性实验

目录 一、实验拓扑 二、实验要求 三、实验步骤 1、IP地址配置 2、ospf配置 3、BGP建邻 4、宣告网段 5、配置团体属性 一、实验拓扑 二、实验要求 1、按照图示配 IP 地址&#xff0c;R2&#xff0c;R3&#xff0c;R4&#xff0c;R5分别配 Loopbacke 口地址作为OSPF的Ro…

系列六、GC垃圾回收【四大垃圾算法-标记清除算法】

一、概述 标记清除算法分为两个阶段&#xff0c;即&#xff1a;标记和清除两个阶段&#xff0c;先标记出要回收的对象&#xff0c;然后统一回收这些对象。形如&#xff1a; 老年代一般是由标记清除或者标记清除 标记压缩的混合实现。 二、原理 用通俗的话解释一下标记清除算法…

深入解析:开发抖音酒店景区小程序的技术

抖音作为社交媒体平台的佼佼者&#xff0c;其独特的风格和用户基础吸引了无数开发者的目光。在本文中&#xff0c;我们将深入解析开发抖音酒店景区小程序的关键技术&#xff0c;为开发者提供实用指南。 1.抖音风格设计 在开发酒店景区小程序时&#xff0c;首先要注重界面设计…

Leetcode—剑指Offer LCR 140.训练计划II【简单】

2023每日刷题&#xff08;三十三&#xff09; Leetcode—LCR 140.训练计划II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* trainingPlan(struct ListNode* head, int cnt) {str…

C/C++ 获取主机网卡MAC地址

MAC地址&#xff08;Media Access Control address&#xff09;&#xff0c;又称为物理地址或硬件地址&#xff0c;是网络适配器&#xff08;网卡&#xff09;在制造时被分配的全球唯一的48位地址。这个地址是数据链路层&#xff08;OSI模型的第二层&#xff09;的一部分&#…

《向量数据库指南》——什么是 向量数据库Milvus Cloud的Range Search?

Range Search 功能诞生于社区。 某天,一位做系统推荐的用户在社区提出了需求,希望 Milvus Cloud 能提供一个新功能,可以返回向量距离在一定范围之内的结果。而这不是个例,开发者在做相似性查询时,经常需要对结果做二次过滤。 为了帮助用户解决这一问题,Milvus Cl…

STL的介绍

STL 是 C 标准模板库&#xff08;Standard Template Library&#xff09;的缩写&#xff0c;是 C 标准库中的一个重要组成部分。STL 提供了一组通用的模板类和函数&#xff0c;用于实现常用的数据结构和算法&#xff0c;如向量&#xff08;vector&#xff09;、链表&#xff08…

科大讯飞会议笔记本、GoodNotes、E人E本 功能及体验对比

科大讯飞会议笔记本、GoodNotes、E人E本功能及体验对比 【旧文档&#xff0c;怕失传】 通过对科大讯飞会议笔记本、基于iPad的GoodNotes以及E人E本的各项功能指标进行了实际对比&#xff0c;得出了以下结果&#xff1a; 在实际体验中&#xff0c;科大讯飞笔记本在录音方面表…

酷柚易汛ERP - 盘点操作指南

1、应用场景 盘点功能是定期或临期对库存货物进行清点&#xff0c;使账面记录与实际库存相符合&#xff0c;从而随时掌握货物盈亏状态。 2、主要操作 2.1 盘点商品查询 打开【仓库】-【盘点】新增盘点单&#xff0c;筛选需要盘点的日期范围、库存及相应商品 2.2 录入盘点数…
最新文章