目前只做了JPEG文件和PNG文件的水印处理 ## 修改文件app/lea/Image.go 原文件基本上是空的,所以这里就直接贴上我修改以后的了 需要将水印文件watermark.png上传至public/images中 ```go package lea import ( "github.com/revel/revel" "image" "image/draw" "image/jpeg" "image/png" "net/http" "fmt" "os" ) func waterJpeg(path string) (ok bool, transPath string) { // 水印图片文件 water := revel.BasePath + "/public/images/watermark.png" img_file, err := os.Open(path) defer img_file.Close() if err != nil { fmt.Println("打开图片出错") fmt.Println(err) return ok, path } img, err := jpeg.Decode(img_file) if err != nil { fmt.Println("把图片解码为结构体时出错") fmt.Println(img) return ok, path } wmb_file, err := os.Open(water) if err != nil { fmt.Println("打开水印图片"+water+"出错") fmt.Println(err) return ok, path } wmb_img, err := png.Decode(wmb_file) if err != nil { defer wmb_file.Close() fmt.Println("把水印图片解码为结构体时出错") fmt.Println(err) return ok, path } //把水印写在右下角,并向0坐标偏移10个像素 offset := image.Pt(img.Bounds().Dx()-wmb_img.Bounds().Dx()-10, img.Bounds().Dy()-wmb_img.Bounds().Dy()-10) b := img.Bounds() //根据b画布的大小新建一个新图像 m := image.NewRGBA(b) //image.ZP代表Point结构体,目标的源点,即(0,0) //draw.Src源图像透过遮罩后,替换掉目标图像 //draw.Over源图像透过遮罩后,覆盖在目标图像上(类似图层) draw.Draw(m, b, img, image.ZP, draw.Src) draw.Draw(m, wmb_img.Bounds().Add(offset), wmb_img, image.ZP, draw.Over) //生成新图片new.jpg,并设置图片质量 fmt.Println("写入文件") img_sfile, err := os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0) //n, _ := img_file.Seek(0, os.SEEK_END) jpeg.Encode(img_sfile, m, &jpeg.Options{100}) defer img_sfile.Close() defer wmb_file.Close() return ok, path } func waterPng(path string) (ok bool, transPath string) { // 水印图片文件 water := revel.BasePath + "/public/images/watermark.png" img_file, err := os.Open(path) defer img_file.Close() if err != nil { fmt.Println("打开图片出错") fmt.Println(err) return ok, path } img, err := png.Decode(img_file) if err != nil { fmt.Println("把图片解码为结构体时出错") fmt.Println(img) return ok, path } wmb_file, err := os.Open(water) if err != nil { fmt.Println("打开水印图片"+water+"出错") fmt.Println(err) return ok, path } wmb_img, err := png.Decode(wmb_file) if err != nil { defer wmb_file.Close() fmt.Println("把水印图片解码为结构体时出错") fmt.Println(err) return ok, path } //把水印写在右下角,并向0坐标偏移10个像素 offset := image.Pt(img.Bounds().Dx()-wmb_img.Bounds().Dx()-10, img.Bounds().Dy()-wmb_img.Bounds().Dy()-10) b := img.Bounds() //根据b画布的大小新建一个新图像 m := image.NewRGBA(b) //image.ZP代表Point结构体,目标的源点,即(0,0) //draw.Src源图像透过遮罩后,替换掉目标图像 //draw.Over源图像透过遮罩后,覆盖在目标图像上(类似图层) draw.Draw(m, b, img, image.ZP, draw.Src) draw.Draw(m, wmb_img.Bounds().Add(offset), wmb_img, image.ZP, draw.Over) //生成新图片new.jpg,并设置图片质量 fmt.Println("写入文件") img_sfile, err := os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0) //n, _ := img_file.Seek(0, os.SEEK_END) png.Encode(img_sfile, m) defer img_sfile.Close() defer wmb_file.Close() return ok, path } func TransToGif(path string, maxWidth uint, afterDelete bool) (ok bool, transPath string) { //图片,网上随便找了一张 img_file, err := os.Open(path) defer img_file.Close() if err != nil { fmt.Println("打开图片出错") fmt.Println(err) return ok, path } buff := make([]byte, 512) _, err = img_file.Read(buff) if err != nil { fmt.Println("读取源文件"+path+"时出错"); fmt.Println(err) return ok,path } imgType := http.DetectContentType(buff) if imgType == "image/jpeg" { _, toPathGif := waterJpeg(path) return ok,toPathGif } else if imgType == "image/png" { _, toPathGif := waterPng(path) return ok,toPathGif } else { fmt.Println("不支持的图片类型"+imgType) return ok,path } } ``` ## JPG文件水印预览 ![](https://imzhp.com/api/file/getImage?fileId=5de28b7e1563da0012000001) ![](/api/file/getImage?fileId=5e00f4bce8ede67237000001) ## PNG文件水印预览 ![](https://imzhp.com/api/file/getImage?fileId=5de288dd1563da001300000b) 最后修改:5年前 © 著作权归作者所有