go包resize、draw图片缩放、合并图片

该博客介绍了如何使用Go语言进行图片处理,包括从网络获取图片、按宽度缩放图片以及将两张图片合并到一起。主要涉及的函数有GetImageFromNet、ImageZoom和MergeImageNew,实现了创建带有二维码的海报功能。
摘要由CSDN通过智能技术生成
package main

import (
	"fmt"
	"image"
	"image/draw"
	"image/jpeg"
	"net/http"
	"os"
	"strconv"
	"time"

	"github.com/nfnt/resize"
	"golang.org/x/sync/errgroup"
)

func main() {
	img := strconv.Itoa(int(time.Now().UnixNano())) + ".jpeg"
	f, err := os.Create(img)
	if err != nil {
		fmt.Println("Create", err)
		return
	}
	// 把二维码图片合到海报上
	rgba, err := MergeImageNew("http://img/16028328876241490.jpeg", "http://8134.jpg", 76, 436, 87)
	if err != nil {
		fmt.Println("MergeImageNew", err)
		return
	}
	err = jpeg.Encode(f, rgba, nil)
	if err != nil {
		fmt.Println("Encode", err)
		return
	}
}

// MergeImageNew 图片合并 baseUrl:原图图片地址,maskUrl:小图图片地址
func MergeImageNew(baseUrl, maskUrl string, paddingX int, paddingY int, width uint) (*image.RGBA, error) {
	eg := errgroup.Group{}
	var base image.Image
	eg.Go(func() error {
		var err error
		base, err = GetImageFromNet(baseUrl)
		return err
	})
	mask, err := ImageZoom(maskUrl, width)
	if err != nil {
		return nil, err
	}
	if err = eg.Wait(); err != nil {
		return nil, err
	}
	baseSrcBounds := base.Bounds().Max
	maskSrcBounds := mask.Bounds().Max

	newWidth := baseSrcBounds.X
	newHeight := baseSrcBounds.Y

	maskWidth := maskSrcBounds.X
	maskHeight := maskSrcBounds.Y

	des := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight)) // 底板
	//首先将一个图片信息存入jpg
	draw.Draw(des, des.Bounds(), base, base.Bounds().Min, draw.Over)
	//将另外一张图片信息存入jpg
	fmt.Println(newHeight, paddingY, maskHeight)
	draw.Draw(des, image.Rect(paddingX, paddingY, (paddingX+maskWidth), (maskHeight+paddingY)), mask, image.Point{}, draw.Over)
	return des, nil
}

// GetImageFromNet 从远程读取图片
func GetImageFromNet(url string) (image.Image, error) {
	res, err := http.Get(url)
	if err != nil || res.StatusCode != 200 {
		return nil, err
	}
	defer res.Body.Close()
	m, _, err := image.Decode(res.Body)
	return m, err
}

// ImageZoom 按宽度缩放图片
func ImageZoom(url string, width uint) (image.Image, error) {
	m, err := GetImageFromNet(url)
	if err != nil {
		return nil, err
	}
	if width == 0 {
		return m, nil
	}
	thImg := resize.Resize(width, 0, m, resize.Lanczos3)
	return thImg, nil
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值