|
|
|
@ -4,7 +4,14 @@ import ( |
|
|
|
"appNewPlatform/generalmethod" |
|
|
|
"appNewPlatform/utils" |
|
|
|
"appNewPlatform/utils/formatoutput" |
|
|
|
"fmt" |
|
|
|
"image" |
|
|
|
"image/draw" |
|
|
|
"image/jpeg" |
|
|
|
"image/png" |
|
|
|
"os" |
|
|
|
|
|
|
|
svg "github.com/ajstarks/svgo" |
|
|
|
"github.com/gin-gonic/gin" |
|
|
|
) |
|
|
|
|
|
|
|
@ -36,3 +43,223 @@ func (a *ApiMethod) Index(c *gin.Context) { |
|
|
|
func (a *ApiMethod) JieXiJwt(c *gin.Context) { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
* |
|
|
|
@ 作者: 秦东 |
|
|
|
@ 时间: 2024-11-08 15:20:28 |
|
|
|
@ 功能: 实验图片改变格式 |
|
|
|
@ 参数 |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
@ 返回值 |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
@ 方法原型 |
|
|
|
|
|
|
|
# |
|
|
|
*/ |
|
|
|
func (a *ApiMethod) JpgToSvg(c *gin.Context) { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
* |
|
|
|
@ 作者: 秦东 |
|
|
|
@ 时间: 2024-11-08 15:21:29 |
|
|
|
@ 功能: 将图像转换为SVG |
|
|
|
@ 参数 |
|
|
|
|
|
|
|
#inputImagePath 来源 |
|
|
|
#outputSVGPath 目标 |
|
|
|
|
|
|
|
@ 返回值 |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
@ 方法原型 |
|
|
|
|
|
|
|
# |
|
|
|
*/ |
|
|
|
func ImageToSVG(inputImagePath, outputSVGPath string) error { |
|
|
|
// 打开输入图像文件
|
|
|
|
inputFile, err := os.Open(inputImagePath) |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("无法打开输入图像文件: %v", err) |
|
|
|
} |
|
|
|
defer inputFile.Close() |
|
|
|
|
|
|
|
// 解码图像
|
|
|
|
var img image.Image |
|
|
|
var config image.Config |
|
|
|
if inputImagePath[len(inputImagePath)-3:] == "png" { |
|
|
|
img, err = png.Decode(inputFile) |
|
|
|
} else if inputImagePath[len(inputImagePath)-3:] == "jpg" { |
|
|
|
img, err = jpeg.Decode(inputFile) |
|
|
|
} else { |
|
|
|
return fmt.Errorf("不支持的图像格式") |
|
|
|
} |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("无法解码图像: %v", err) |
|
|
|
} |
|
|
|
|
|
|
|
// 创建一个空白的RGBA图像,大小与原始图像相同
|
|
|
|
rgba := image.NewRGBA(image.Rect(0, 0, config.Width, config.Height)) |
|
|
|
draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src) |
|
|
|
|
|
|
|
// 创建SVG文件
|
|
|
|
outputFile, err := os.Create(outputSVGPath) |
|
|
|
if err != nil { |
|
|
|
return fmt.Errorf("无法创建SVG文件: %v", err) |
|
|
|
} |
|
|
|
defer outputFile.Close() |
|
|
|
|
|
|
|
// 初始化SVG绘制上下文
|
|
|
|
svg := svg.New(outputFile) |
|
|
|
svg.Start(config.Width, config.Height) |
|
|
|
|
|
|
|
// 遍历图像的每个像素,将其绘制到SVG中
|
|
|
|
for y := 0; y < config.Height; y++ { |
|
|
|
for x := 0; x < config.Width; x++ { |
|
|
|
r, g, b, a := rgba.At(x, y).RGBA() |
|
|
|
svg.Rect(x, y, 1, 1, fmt.Sprintf("fill:rgba(%d,%d,%d,%f)", r>>8, g>>8, b>>8, float64(a)/65535)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
svg.End() |
|
|
|
|
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
* |
|
|
|
@ 作者: 秦东 |
|
|
|
@ 时间: 2024-11-08 16:24:10 |
|
|
|
@ 功能: |
|
|
|
@ 参数 |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
@ 返回值 |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
@ 方法原型 |
|
|
|
|
|
|
|
# |
|
|
|
*/ |
|
|
|
// func ImgToSvg(inputImagePath, outputSVGPath string) {
|
|
|
|
// // 打开输入的 PNG 图像文件
|
|
|
|
// inputFile, err := os.Open("input.png")
|
|
|
|
// if err != nil {
|
|
|
|
// log.Fatalf("无法打开输入图像文件: %v", err)
|
|
|
|
// }
|
|
|
|
// defer inputFile.Close()
|
|
|
|
|
|
|
|
// // 解码 PNG 图像
|
|
|
|
// img, err := png.Decode(inputFile)
|
|
|
|
// if err != nil {
|
|
|
|
// log.Fatalf("无法解码 PNG 图像: %v", err)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 获取图像的边界
|
|
|
|
// bounds := img.Bounds()
|
|
|
|
// width, height := bounds.Max.X, bounds.Max.Y
|
|
|
|
|
|
|
|
// // 将图像转换为 RGBA 格式
|
|
|
|
// rgbaImg := image.NewRGBA(bounds)
|
|
|
|
// draw.Draw(rgbaImg, bounds, img, image.Point{0, 0}, draw.Src)
|
|
|
|
|
|
|
|
// // 使用 go-libimagequant 进行图像量化
|
|
|
|
// quantizer := imagequant.NewQuantizer()
|
|
|
|
// defer quantizer.Close()
|
|
|
|
|
|
|
|
// // 配置量化参数(可选,这里使用默认参数)
|
|
|
|
// quantizer.SetMaxColors(256)
|
|
|
|
// quantizer.SetMinQuality(75)
|
|
|
|
|
|
|
|
// // 对图像进行量化
|
|
|
|
// result, err := quantizer.Quantize(rgbaImg)
|
|
|
|
// if err != nil {
|
|
|
|
// log.Fatalf("图像量化失败: %v", err)
|
|
|
|
// }
|
|
|
|
// defer result.Close()
|
|
|
|
|
|
|
|
// // 创建新的图像,使用量化后的颜色
|
|
|
|
// quantizedImg := image.NewPaletted(bounds, result.Palette())
|
|
|
|
// for y := 0; y < height; y++ {
|
|
|
|
// for x := 0; x < width; x++ {
|
|
|
|
// index := result.Image().At(x, y).(color.NRGBA).R
|
|
|
|
// quantizedImg.Set(x, y, result.Palette()[int(index)])
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 保存量化后的图像为新的 PNG 文件
|
|
|
|
// outputFile, err := os.Create("output.png")
|
|
|
|
// if err != nil {
|
|
|
|
// log.Fatalf("无法创建输出图像文件: %v", err)
|
|
|
|
// }
|
|
|
|
// defer outputFile.Close()
|
|
|
|
|
|
|
|
// if err := png.Encode(outputFile, quantizedImg); err != nil {
|
|
|
|
// log.Fatalf("无法保存输出图像文件: %v", err)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// log.Println("图像量化完成,已保存为 output.png")
|
|
|
|
// }
|
|
|
|
|
|
|
|
/* |
|
|
|
* |
|
|
|
@ 作者: 秦东 |
|
|
|
@ 时间: 2024-11-09 08:20:56 |
|
|
|
@ 功能: |
|
|
|
@ 参数 |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
@ 返回值 |
|
|
|
|
|
|
|
# |
|
|
|
|
|
|
|
@ 方法原型 |
|
|
|
|
|
|
|
# |
|
|
|
*/ |
|
|
|
func JpgPngToSvg(inputPAgth, outputPath string) { |
|
|
|
// imgFile, err := os.Open(inputPAgth)
|
|
|
|
// if err != nil {
|
|
|
|
// log.Fatalf("Error opening image: %v", err)
|
|
|
|
// }
|
|
|
|
// defer imgFile.Close()
|
|
|
|
|
|
|
|
// img, _, err := image.Decode(imgFile)
|
|
|
|
|
|
|
|
// if err != nil {
|
|
|
|
// log.Fatalf("Error decoding image: %v", err)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 创建一个新的SVG画布
|
|
|
|
// dc := gg.NewContext(img.Bounds().Dx(), img.Bounds().Dy())
|
|
|
|
// // 将图片绘制到SVG上下文
|
|
|
|
// dc.DrawImage(img, 0, 0)
|
|
|
|
// // 将SVG内容写入文件
|
|
|
|
// var buf bytes.Buffer
|
|
|
|
|
|
|
|
// if err := gg.RenderToSVG(&buf, dc.Image().Bounds(), dc.Image(), nil); err != nil { //+
|
|
|
|
// log.Fatalf("Error rendering to SVG: %v", err) //+
|
|
|
|
// } //+
|
|
|
|
|
|
|
|
// svgFile, err := os.Create("output.svg")
|
|
|
|
// if err != nil {
|
|
|
|
// log.Fatalf("Error creating SVG file: %v", err)
|
|
|
|
// }
|
|
|
|
// defer svgFile.Close()
|
|
|
|
|
|
|
|
// if _, err := io.Copy(svgFile, &buf); err != nil {
|
|
|
|
// log.Fatalf("Error writing SVG file: %v", err)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// fmt.Println("Image converted to SVG successfully.")
|
|
|
|
} |
|
|
|
|