zoukankan      html  css  js  c++  java
  • golang实现给图片加水印

    最近跟在写golang图片加水印的方法,这里用的是一些基本的功能。

    package main
    
    import (
    	"fmt"
    	"image"
    	"image/draw"
    	"image/jpeg"
    	"image/png"
    	"os"
    )
    
    func main() {
    	//图片,网上随便找了一张
    	img_file, err := os.Open("bg.jpg")
    	if err != nil {
    		fmt.Println("打开图片出错")
    		fmt.Println(err)
    		os.Exit(-1)
    	}
    	defer img_file.Close()
    	img, err := jpeg.Decode(img_file)
    	if err != nil {
    		fmt.Println("把图片解码为结构体时出错")
    		fmt.Println(img)
    		os.Exit(-1)
    	}
    
    	//水印,用的是我自己支付宝的二维码
    	wmb_file, err := os.Open("alipay.png")
    	if err != nil {
    		fmt.Println("打开水印图片出错")
    		fmt.Println(err)
    		os.Exit(-1)
    	}
    	defer wmb_file.Close()
    	wmb_img, err := png.Decode(wmb_file)
    	if err != nil {
    		fmt.Println("把水印图片解码为结构体时出错")
    		fmt.Println(err)
    		os.Exit(-1)
    	}
    
    	//把水印写在右下角,并向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,并设置图片质量
    	imgw, err := os.Create("new.jpg")
    	jpeg.Encode(imgw, m, &jpeg.Options{100})
    	defer imgw.Close()
    
    	fmt.Println("添加水印图片结束请查看")
    }
    

    draw.Draw方法既然可以按调用的顺序不同实现的也不同,可以用这个扩展让多个基本的图片靠位置与层叠方式来拼成一个图,最适合表情包制作。另外感觉有些滤镜效果结合png包应该也可以用他做出来。

  • 相关阅读:
    javascript平时小例子③(setInterval使用1)
    javascript平时小例子②(正则表达式验证邮箱)
    javascript平时小例子①(移动的小div)
    Ansible主机清单Inventory文件hosts
    K8s Deployment YAML 名词解释
    Linux自带神器logrotate详解
    Redis性能指标监控
    页面无任何操作30秒后退出1
    java 加法变乘法
    java 九数组分数
  • 原文地址:https://www.cnblogs.com/ExMan/p/13158662.html
Copyright © 2011-2022 走看看