init: 完成了图片加水印

This commit is contained in:
cancerai committed 2026-09-28 21:56:04 +08:00
commit aca23f2326
10 files changed
+499

No files matched your search

+136
View File
@@ -0,0 +1,136 @@
import { pathToFileURL } from "bun";
import { Hono } from "hono";
import { onlySSG } from "hono/ssg";
import { validator } from "hono/validator";
import { isQuestionOrPlusOrMinusToken } from "typescript/unstable/ast";
import { Signature } from "typescript/unstable/sync";
const appTmp = new Hono()
const app = appTmp.basePath("/watermark")
/**
* param: image: 图片大小必须<=10MB
* param: payload: 必须是长度<=8的字母大小写或数字组合
* param: strength: 取值>=0,一般取值0~1.5
* param: outputType: 输出的文件类型,只允许 jpeg | png
*/
app.post("/encode",
validator("form", (val, c) => {
const image = val.image
const payload = val.payload
const strength = val.strength
const outputType = val.outputType
if (
image == undefined ||
payload == undefined ||
strength == undefined ||
outputType == undefined
) {
c.status(400)
return c.json({
code: 400,
msg: "Paarameter is invalid"
})
}
if ((image as File).size == 0) {
c.status(400)
return c.json({
code: 400,
msg: "Image is empty"
})
}
const MAX_IMAGE_SIZE = 10 * 1024 * 1024
if ((image as File).size > MAX_IMAGE_SIZE) {
c.status(400)
return c.json({
code: 400,
msg: "Image size is too large, must<=10MB"
})
}
if ((payload as string).length > 8 || (payload as string).length <= 0) {
c.status(400)
return c.json({
code: 400,
msg: "Parameter[payload] length must > 0 and <= 8"
})
}
if (!/^[a-zA-Z0-9]+$/.test(payload as string)) {
c.status(400)
return c.json({
code: 400,
msg: "Parameter[payload] must be an ASCII string"
})
}
if (isNaN(Number(strength))) {
c.status(400)
return c.json({
code: 400,
msg: "Parameter[strength] must be a number"
})
}
const tmpStrength = Number(strength)
if (tmpStrength < 0 || tmpStrength > 100) {
c.status(400)
return c.json({
code: 400,
msg: "Parameter[strength] must >= 0 and <= 100"
})
}
if (
!((outputType as string) == "jpeg" ||
(outputType as string) == "png")
) {
c.status(400)
return c.json({
code: 400,
msg: "Parameter[outputType] only support jpeg and png"
})
}
return val
}),
async (c) => {
const formData = await c.req.formData()
const image: File = formData.get("image") as File
const payload: string = formData.get("payload") as string
const strength: number = Number(formData.get("strength"))
const outputType: string = formData.get("outputType") as string
const data = new FormData()
data.append("image", image)
data.append("payload", payload)
data.append("strength", strength.toString())
data.append("outputType", outputType)
let canFetch: boolean = true
const response = await fetch("http://localhost:8081/watermark/encode", {
method: "POST",
body: data
}).catch((e) => {
canFetch = false
})
if (!canFetch) {
c.status(500)
return c.json({
code: 500,
msg: "Cannot fetch http://localhost:8081/watermark/encode"
})
}
const resImage = await response!.blob()
return c.body(resImage)
})
export default {
port: 8080,
fetch: app.fetch
}