<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; 图片占位</title>
	<atom:link href="https://www.phppan.com/tag/%e5%9b%be%e7%89%87%e5%8d%a0%e4%bd%8d/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 25 Apr 2026 00:56:17 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>实在没辙了！只好祭出AI，给自己撸了个图片占位生成器</title>
		<link>https://www.phppan.com/2025/05/ai-placeholder/</link>
		<comments>https://www.phppan.com/2025/05/ai-placeholder/#comments</comments>
		<pubDate>Sat, 24 May 2025 00:20:16 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AI编程]]></category>
		<category><![CDATA[图片占位]]></category>
		<category><![CDATA[图片占位生成器]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2375</guid>
		<description><![CDATA[对于前端开发者而言，图片占位生成器是一个不可或缺的工具。 在实际开发中，我们经常会碰到这样的场景：产品展示页面 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color: #191b1f;" data-first-child="" data-pid="gM6THN4Y">对于前端开发者而言，图片占位生成器是一个不可或缺的工具。</p>
<p style="color: #191b1f;" data-pid="lCb-pQUr">在实际开发中，我们经常会碰到这样的场景：产品展示页面的布局已经完成，各个模块都已就位，唯独缺少产品图片。而此时设计团队反馈：「图片素材还在制作中，预计下周交付。」</p>
<p style="color: #191b1f;" data-pid="LZwqoQtj">另一种常见情况是，在调试图片列表的响应式布局时，需要各种尺寸的测试图片。传统做法是通过搜索引擎寻找合适的图片，然后逐一下载、裁剪、调整尺寸。这个过程往往耗时良久，严重影响开发效率。</p>
<p style="color: #191b1f;" data-pid="xwvjHYXE">除了效率问题，版权风险也不容忽视。在项目中使用网络图片时，我们必须考虑：这些图片是否有版权限制？是否适合在商业项目中使用？这些问题如果处理不当，可能会给项目带来法律风险。</p>
<p style="color: #191b1f;" data-pid="2S7NAVdn">还有一些场景，如我们动态生成图片，在图片上显示提示的内容这种相对小众的场景。</p>
<p style="color: #191b1f;" data-pid="bSDJB8Fz">本周刚好有一个需求是给飞书捷径做一个小功能用到了图片占位生成。梳理完需求，大概如下：</p>
<ol style="color: #191b1f;">
<li data-pid="_o-44lug">能指定宽和高</li>
<li data-pid="fKjN6IDK">能自定义文字</li>
<li data-pid="bQJ9LnOl">能指定文本颜色和背景色</li>
<li data-pid="RwSwBD83">能指定图片格式输出，支持 PNG</li>
<li data-pid="b6Tzku-g">能指定文本大小</li>
<li data-pid="XP9RiBG0">能在飞书中使用</li>
</ol>
<p style="color: #191b1f;" data-pid="-u7peta_">首先我们看一下有哪些在线的图片占位生成器可用的。</p>
<p style="color: #191b1f;" data-pid="_PeoNkm8">我们先让最新的 Claude-4-Opus 大模型给出 10 个地址，如下图：</p>
<figure style="color: #191b1f;" data-size="normal"><img class="origin_image zh-lightbox-thumb lazy" src="https://pic3.zhimg.com/80/v2-b15d27bda439302415faf8bba5b879da_1440w.webp" alt="" width="1602" height="1194" data-caption="" data-size="normal" data-rawwidth="1602" data-rawheight="1194" data-original-token="v2-833cee0c75dd613051cb434a8252d556" data-original="https://pic3.zhimg.com/v2-b15d27bda439302415faf8bba5b879da_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-b15d27bda439302415faf8bba5b879da_1440w.jpg" data-lazy-status="ok" /></figure>
<div class="highlight" style="color: #191b1f;">
<pre><code class="language-text">1. **Placeholder.com【不可用】**
- **URL**: https://via.placeholder.com/
- **使用方法**: `https://via.placeholder.com/300x200`
- **特点**: 简单易用，支持自定义颜色和文字

2. **Lorem Picsum【能用，随机真实图片】**
- **URL**: https://picsum.photos/
- **使用方法**: `https://picsum.photos/200/300`
- **特点**: 提供随机的高质量真实图片

3. **Placehold.it【跳到 Placeholder.com 也不可用了】**
- **URL**: https://placehold.it/
- **使用方法**: `https://placehold.it/350x150`
- **特点**: 经典的占位图服务，支持多种格式

4. **PlaceIMG【不可用】**
- **URL**: https://placeimg.com/
- **使用方法**: `https://placeimg.com/640/480/any`
- **特点**: 可选择不同类别（动物、建筑、自然等）

5. **Dummy Image【可用，不支持中文】**
- **URL**: https://dummyimage.com/
- **使用方法**: `https://dummyimage.com/600x400/000/fff`
- **特点**: 高度可定制，支持自定义背景色和文字颜色

6. **LoremFlickr【可用，不支持自定义内容】**
- **URL**: https://loremflickr.com/
- **使用方法**: `https://loremflickr.com/320/240`
- **特点**: 基于Flickr的真实图片，支持关键词搜索

7. **Placekitten【不可用】**
- **URL**: https://placekitten.com/
- **使用方法**: `https://placekitten.com/200/300`
- **特点**: 提供可爱的猫咪图片作为占位图

8. **Unsplash Source【不可用】**
- **URL**: https://source.unsplash.com/
- **使用方法**: `https://source.unsplash.com/1600x900/?nature`
- **特点**: 使用Unsplash的高质量图片库

9. **PlaceBear【可用，不支持自定义内容】**
- **URL**: https://placebear.com/
- **使用方法**: `https://placebear.com/200/300`
- **特点**: 提供熊的图片作为占位图

10. **FakeIMG.pl【可用，不支持中文】**
- **URL**: https://fakeimg.pl/
- **使用方法**: `https://fakeimg.pl/300x200/ff0000/ffffff?text=Hello`
- **特点**: 支持自定义文字、字体和颜色
</code></pre>
</div>
<p style="color: #191b1f;" data-pid="bgm4jTew">以上 10 个站点看下来，就 1 和 5 相对符合需求，但都不支持中文。</p>
<p style="color: #191b1f;" data-pid="x-gG57wq">AI 不行，搜索来凑，一顿 Goole 下来，又找到以下的几个：</p>
<p style="color: #191b1f;" data-pid="RBPpjyqp">1.<span style="font-weight: 600;"><a class=" external" style="color: inherit;" href="https://link.zhihu.com/?target=http%3A//placehold.co" target="_blank" rel="nofollow noreferrer" data-za-detail-view-id="1043"><span class="invisible" style="font-weight: normal; color: transparent;">http://</span><span class="visible">placehold.co</span></a>【可用，不支持中文】</span></p>
<p style="color: #191b1f;" data-pid="oJNdeJpC">示例：<span style="color: #000000;">https://placehold.co/600&#215;400?text=Hello+World</span></p>
<figure style="color: #191b1f;" data-size="normal"><img class="origin_image zh-lightbox-thumb lazy" src="https://pic2.zhimg.com/80/v2-daf5ad074bf16681b83204de9a735ccb_1440w.webp" alt="" width="600" height="400" data-caption="" data-size="normal" data-rawwidth="600" data-rawheight="400" data-original-token="v2-6b1a565fdfa3d78e97176b6149edef70" data-original="https://pic2.zhimg.com/v2-daf5ad074bf16681b83204de9a735ccb_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-daf5ad074bf16681b83204de9a735ccb_1440w.jpg" data-lazy-status="ok" /></figure>
<p style="color: #191b1f;" data-pid="L_hHbzlY">2.<span style="font-weight: 600;">fakeimg.pl</span></p>
<p style="color: #191b1f;" data-pid="c639Iau7">示例：<span style="color: #000000;">https://fakeimg.pl/300/?text=哈哈&amp;font=noto</span></p>
<figure style="color: #191b1f;" data-size="normal"><img class="origin_image zh-lightbox-thumb lazy" src="https://pic4.zhimg.com/80/v2-8d0435b65279f7f6a9ee72f27527a7c9_1440w.webp" alt="" width="600" height="600" data-caption="" data-size="normal" data-rawwidth="600" data-rawheight="600" data-original-token="v2-3462142d96c210e2ff063718d45923c3" data-original="https://pic4.zhimg.com/v2-8d0435b65279f7f6a9ee72f27527a7c9_r.jpg" data-actualsrc="https://pic4.zhimg.com/v2-8d0435b65279f7f6a9ee72f27527a7c9_1440w.jpg" data-lazy-status="ok" /></figure>
<p style="color: #191b1f;" data-pid="iegMyvlo">fakeimg.pl 在功能上需求都能满足，不管是大小、字体、中文，但是它在飞书中作为附件使用的时候竟然出错了。使用 dummyimage 却没有这个问题。 试了几次发现怎么都绕不过去，只能另想他法。</p>
<p style="color: #191b1f;" data-pid="fbMkVWvB">3.<span style="font-weight: 600;">tool.lu</span></p>
<p style="color: #191b1f;" data-pid="LPNkb40l">示例：<span style="color: #000000;">https://iph.href.lu/600&#215;400?text=哈哈哈</span></p>
<figure style="color: #191b1f;" data-size="normal"><img class="origin_image zh-lightbox-thumb lazy" src="https://pic3.zhimg.com/80/v2-43b30a9c036e1df9ef545cbd1dcd78f4_1440w.webp" alt="" width="600" height="400" data-caption="" data-size="normal" data-rawwidth="600" data-rawheight="400" data-original-token="v2-9934bff305610179b9d9c66ae8a65453" data-original="https://pic3.zhimg.com/v2-43b30a9c036e1df9ef545cbd1dcd78f4_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-43b30a9c036e1df9ef545cbd1dcd78f4_1440w.jpg" data-lazy-status="ok" /></figure>
<p style="color: #191b1f;" data-pid="dDFxwdMN">tool.lu 的图片占位功能能完全满足需求，但是和 2 一样，在飞书下会报错。</p>
<p style="color: #191b1f;" data-pid="gbq8ufrD">4.<span style="font-weight: 600;">devtool.tech</span></p>
<p style="color: #191b1f;" data-pid="NpAq8iTg">界面最好的一个生成站点，但是格式是 SVG 的</p>
<p style="color: #191b1f;" data-pid="zQBQaqNl">以上只是基本可用的，还不排除那些功能不满足，失效了的，各种，折腾了两个小时，能满足需求的飞书用不了，飞书能用的不支持中文，死循环了。</p>
<p style="color: #191b1f;" data-pid="iP9pG3Y9"><span style="font-weight: 600;">只能自己撸了</span>。</p>
<p style="color: #191b1f;" data-pid="f73KXAEA">祭出 AI，花了两小时（代码只花了半小时，还包括框架搭建），本地运行没有问题，把代码部署到线上，能正常显示，但是飞书用不了，一样的报错：</p>
<div class="highlight" style="color: #191b1f;">
<pre><code class="language-text">execute error，捷径执行出错：
Error: execute原始执行结果：
捷径返回错误码： FieldCode.Success 
 转换结果：transform cell value fail
</code></pre>
</div>
<p style="color: #191b1f;" data-pid="sJ_YnRHg">这回是自己写的代码，终于可以定位并解决问题了。对比能用的地址和不能用的地址，从头文件中发现了两个字段的差别，一个是跨域：Access-Control-Allow-Origin，一个是返回长度：Content-Length</p>
<p style="color: #191b1f;" data-pid="-l7wBEOv">最终试验发现是：Content-Length</p>
<p style="color: #191b1f;" data-pid="uPZ5LynN">可能飞书在获取图片并上传成附件的时候做了判断或者校验（<span style="font-weight: 600;">就是个 BUG</span>）。</p>
<p style="color: #191b1f;" data-pid="ctB5GA6t">这个功能已经作为免费的服务放到了开发哥网站（还记得之前 Vibe Coding 写的那个网站不）：</p>
<p style="color: #191b1f;" data-pid="ctB5GA6t"><a title="https://www.kaifage.com/tools/placeholder" href="https://www.kaifage.com/tools/placeholder" target="_blank">https://www.kaifage.com/tools/placeholder</a></p>
<figure style="color: #191b1f;" data-size="normal"><a title="https://www.kaifage.com/tools/placeholder" href="https://www.kaifage.com/tools/placeholder" target="_blank"><img class="origin_image zh-lightbox-thumb lazy" src="https://pic3.zhimg.com/80/v2-66ec72d41fb07b6b8e4b7ede13723af8_1440w.webp" alt="" width="600" height="400" data-caption="" data-size="normal" data-rawwidth="600" data-rawheight="400" data-original-token="v2-45beb60ff6c09070bc8378194697aa2e" data-original="https://pic3.zhimg.com/v2-66ec72d41fb07b6b8e4b7ede13723af8_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-66ec72d41fb07b6b8e4b7ede13723af8_1440w.jpg" data-lazy-status="ok" /></a></figure>
<p style="color: #191b1f;" data-pid="LwyIHcoz">以上。</p>
<p style="color: #191b1f;" data-pid="qjUOK_yN">多说一句，即梦 3.0 生图中的汉字越来越精细了。</p>
<div id="gtx-trans" style="position: absolute; left: 241px; top: 5775px;"></div>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2025/05/ai-placeholder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
