`go
package main
import ( "crypto/sha1" "fmt" "image" "image/draw" "image/jpeg" "image/png" "io/ioutil" "log" "net/http" "os" "path/filepath" "strings" "sync"
"github.com/golang/freetype"
"github.com/golang/freetype/truetype"
"golang.org/x/image/font"
"golang.org/x/image/webp"
)
var ( fontData *truetype.Font bgImages []string allowedExts = []string{".jpg", ".jpeg", ".png", ".webp"} imageCache = sync.Map{} fontLoadError error )
func init() { // 初始化加载字体和背景图片 loadResources() }
func loadResources() { // 加载字体 fontBytes, err := ioutil.ReadFile("../images/font.ttf") if err != nil { fontLoadError = fmt.Errorf("加载字体失败: %v", err) return } fontData, err = freetype.ParseFont(fontBytes) if err != nil { fontLoadError = fmt.Errorf("解析字体失败: %v", err) return }
// 加载背景图片
dir := "../images/"
files, err := ioutil.ReadDir(dir)
if err != nil {
fontLoadError = fmt.Errorf("读取图片目录失败: %v", err)
return
}
for _, file := range files {
if file.IsDir() || strings.HasPrefix(file.Name(), ".") {
continue
}
ext := strings.ToLower(filepath.Ext(file.Name()))
for _, allowed := range allowedExts {
if ext == allowed && file.Name() != "font.ttf" {
bgImages = append(bgImages, filepath.Join(dir, file.Name()))
break
}
}
}
if len(bgImages) == 0 {
fontLoadError = fmt.Errorf("没有找到可用的背景图片")
}
}
func generateImage(text string) (image.Image, error) { if fontLoadError != nil { return nil, fontLoadError }
// 选择背景图片
h := sha1.New()
h.Write([]byte(text))
hash := h.Sum(nil)
idx := int(hash[0]) % len(bgImages)
bgPath := bgImages[idx]
// 检查缓存
if img, ok := imageCache.Load(bgPath); ok {
// 复制一份避免修改缓存
bgImg := img.(image.Image)
rgba := image.NewRGBA(bgImg.Bounds())
draw.Draw(rgba, rgba.Bounds(), bgImg, image.Point{}, draw.Src)
return rgba, nil
}
// 加载图片
file, err := os.Open(bgPath)
if err != nil {
return nil, fmt.Errorf("打开图片失败: %v", err)
}
defer file.Close()
var bgImg image.Image
ext := strings.ToLower(filepath.Ext(bgPath))
switch ext {
case ".png":
bgImg, err = png.Decode(file)
case ".webp":
bgImg, err = webp.Decode(file)
default: // jpg/jpeg
bgImg, err = jpeg.Decode(file)
}
if err != nil {
return nil, fmt.Errorf("解码图片失败: %v", err)
}
// 缓存图片
rgba := image.NewRGBA(bgImg.Bounds())
draw.Draw(rgba, rgba.Bounds(), bgImg, image.Point{}, draw.Src)
imageCache.Store(bgPath, rgba)
return rgba, nil
}
func addTextToImage(img image.Image, text string) (image.Image, error) { // 创建绘图上下文 c := freetype.NewContext() c.SetDPI(72) c.SetFont(fontData) c.SetFontSize(36) c.SetClip(img.Bounds()) c.SetDst(img.(draw.Image)) c.SetSrc(image.White) c.SetHinting(font.HintingFull)
// 计算文字位置
pt := freetype.Pt(
(img.Bounds().Dx()-len(text)*20)/2, // 简单估算宽度
100,
)
_, err := c.DrawString(text, pt)
if err != nil {
return nil, fmt.Errorf("绘制文字失败: %v", err)
}
return img, nil
}
func imageHandler(w http.ResponseWriter, r *http.Request) { // 获取参数 text := r.URL.Query().Get("text") if text == "" { text = "默认文字" }
// 生成图片
img, err := generateImage(text)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 添加文字
img, err = addTextToImage(img, text)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 设置响应头
w.Header().Set("Content-Type", "image/jpeg")
w.Header().Set("Cache-Control", "public, max-age=31536000")
// 输出图片
err = jpeg.Encode(w, img, &jpeg.Options{Quality: 90})
if err != nil {
http.Error(w, "图片编码失败", http.StatusInternalServerError)
}
}
func main() {
http.HandleFunc("/gen_img", imageHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
`
对于AnqiCMS,你需要:
在AnqiCMS的配置文件中添加以下路由规则:
yaml
routes:
- pattern: "/images/*path"
handler: "ImageHandler"
然后实现对应的ImageHandler,或者直接使用反向代理到上面的Go服务。
对于Go站点,Nginx配置可以简化为:
`nginx
location /images/ {
# 代理到Go服务
proxypass http://localhost:8080/genimg?text=$1;
proxysetheader Host $host;
# 缓存控制
expires max;
add_header Cache-Control "public";
# 错误处理
proxy_intercept_errors on;
error_page 404 = @img_rewrite;
}
location @imgrewrite {
rewrite ^/images/(.+)$ /genimg?text=$1 last;
}
`
img_gen.gogo get github.com/golang/freetype golang.org/x/imagego build img_gen.go./img_genhttp://yoursite.com/gen_img?text=示例文字http://yoursite.com/images/示例文字.jpg这个Go实现方案比PHP版本更高效,且更适合集成到AnqiCMS等Go语言开发的站点中。
# 湛江seo哪家有名
# 罗湖seo外包服务推广
# seo课堂视频
# 广告网站建设和优化方案
# 九江百度关键词排名怎么做
# 网站改版栏目优化方案
# seo核心技术是什么
# 怎样通过seo获取流量
# Go语言实现动态图片生成方案
# 烟台网站建设优化推广
# seo网站蓝月*优化
# 网站优化的内容怎么写的
# 郴州网站优化注意事项
# 晋城seo公司甄选20火星
# 南阳许昌智能seo推广
# 扬州市seo公司
# 江北专业的seo如何
# seo课培训seo顾问
# 昆明关键词优化排名推广
# 衡水seo推广
# 焦作关键词搜索排名原理哪家好
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
电子商务平台经营者应遵循哪些核心规则?,seo项目架构
微昕:微昕是什么?如何优化?,辽宁seo哪家效果好
推广普通话,第几个周启动?,短视频seo排名哪家便宜
Google推广加拿大市场-如何做好加拿大市场营销!
双《爱在转角》谁先动心?,宿迁seo优化怎么处理
SEO综合查询,能查到别人信息吗?,seo公司排名推广工具
酒泉抖音SEO,如何快速提升排名?,seo高手找行者SEO
图片背景嵌入关键词优化,如何提升网站排名?,seo有后台吗
数据交换平台架构:双核心引擎,如何高效协同?,枣庄seo推广价格优惠
杭州华港科技,双核驱动,未来何去何从?,词条seo优化
外贸SEO舒心火:如何快速提升企业网站排名?,为什么学习seo
竞价托管?效果如何?揭秘!,浮梁seo快速排名
肥城SEO优化,如何快速提升网站排名?,河北seo推广哪家好做
SEO优化:关键词布局,网站质量提升,如何快速排名?,短视频推广seo营销
社交媒体-Facebook到微博平台仍被严重低估?
电商平台投诉,找客服部门怎么处理?,福州网站优化关键词排名
淘宝客CMS优化,关键词布局精准,SEO排名提升,如何实现双赢?,安徽商城网站优化
网络推广:关键词+如何快速提升品牌知名度?,万词霸屏网站优化方式
跨境进口电商的2016与2017
手机网站,一触即发,你有什么疑问?,鹤壁整站seo关键词排名公司
百度上海浦东总部,科技前沿在哪里?,站群分站seo插件
天津SEO行业佼佼者,哪家公司助力企业网站优化领先一步?,seo a徐雅vlog
嵌入核心关键词:网站建设SEO方法,如何快速提升排名?,seo运营思维
gm互联网推广是骗局?揭秘其真实面目!,seo专员待遇
通化SEO公司独辟蹊径,15名火星员工,背后有何秘密?,抖音seo 杭州
双核心关键词,四川91获客如何高效?,约会专家公司网站做优化上了首页
泰安飞讯网络科技,如何引领未来?,网站优化价格查询
辞职企业年金就没了吗?企业年金如何处理?,上海短视频seo布局
上海大学排名双一流?全国排名如何?,网站结构优化视频
广告优化师是干嘛的?如何提升广告效果?,罗湖好的网站优化公司
淮南论坛吧,双城记,谁主沉浮?,日照seo抖音教学招聘
吕梁SEO公司:如何用火星SEO营销新步骤提升排名?,淘宝seo引流工具
广东SEO优化,如何快速提升网站流量?,大庆seo外包怎么提高
优化网络延迟:关键配置调整?,卢欣欣seo优化
根·核心关键词·何去何从?,查看领域关键词排名软件
营口市抖音SEO,打造爆款短视频秘籍,如何抢占流量高地?,本溪关键词排名技巧
淄博博山,探寻历史与现代交融的旅游胜地?,网站优化谁家专业做的好
媒介专员=核心关键词+疑问?,嘉兴优化对网站的影响
短视频崛起,内容生态如何优化?,全国seo培训厂家
酒泉SEO公司独树一帜,招聘步骤神秘,只招23火星?,流量优化网站
湖南靠谱SEO,如何快速提升网站排名?,广州seo推广培训课程
浙江互联网营销师培训,掌握流量密码?,阜康网站推广优化
全网营销系统靠谱?揭秘高效营销秘诀!,seo网站需要检测什么数据
网络推广,为何企业不能忽视?,英盛网学seo
企业人力资源优化,如何提升员工满意度?,重庆seo公司威欣hfqjwl
国外服务器租用,双线稳定,如何选择?,东圃网站优化排名
社交推广:2019年全球社交媒体广告支出将超过
宕机状态,系统为何突然停止工作?,婚礼搜索关键词排名软件
链商平台,核心关键词嵌入,你了解多少?,北海抖音seo优化排名
双生, life是何方神圣?,哈尔滨网站优化方式
2025-07-04
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。