美文网首页
Golang获取图片尺寸并生成缩略图

Golang获取图片尺寸并生成缩略图

作者: 路过麦田 | 来源:发表于2018-02-07 11:57 被阅读3060次

    有一个需求是生成图片的缩略图,并限定大小,比如说长和宽分别不能超过320和240,由于输入的是图片的路径,所以需要先获取图片的宽高,根据宽高计算出缩略图的宽高,然后生成缩略图,这里遇到的一个问题是

    c, _, err := image.DecodeConfig(file)
    fmt.Println("width = ", c.Width)
    fmt.Println("height = ", c.Height)
    

    上面代码可以获取到图片的宽高,但是后面加载图片数据的时候,会出现错误

    img, _, err := image.Decode(file)
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    
    // 输出 err =  image: unknown format
    

    已经导入了相关包

    import(
        "image"
        _ "image/gif"
        _ "image/jpeg"
        _ "image/png"
    )
    

    image.DecodeConfig(file)image.Decode(file)
    跟先image.Decode(file)image.DecodeConfig(file)
    的结果时一样的,都是后面的会报错,估计就是因为已经Decode过了,所以才会报错
    那Decode后将该文件关掉,然后再次Decode会不会解决问题呢?

    imagePath := "./6.png"
    file, _ := os.Open(imagePath)
        
    c, _, err := image.DecodeConfig(file)
    if err != nil {
        fmt.Println("err1 = ", err)
        return
    }
    width := c.Width
    height := c.Height
    
    file.Close()
    
    file, _ = os.Open(imagePath)
    img, _, err := image.Decode(file)
    if err != nil {
        fmt.Println("err2 = ", err)
        return
    }
    
    fmt.Println("width = ", width)
    fmt.Println("height = ", height)
    
    defer file.Close()
    

    实验了一把,果然不会报错了,如果你只想获取图片的宽高,那肯定只需要image.DecodeConfig(file)了,如果你跟我的需求一样,需要读取图片并获取图片的宽高,那其实还有一种方法:

    imagePath := "./6.png"
    file, _ := os.Open(imagePath)
    defer file.Close()
    
    img, _, err := image.Decode(file)
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    
    b := img.Bounds()
    width := b.Max.X
    height := b.Max.Y
    
    fmt.Println("width = ", width)
    fmt.Println("height = ", height)
    
    

    这样也是可以正确获取图片的宽高的,下面是完整代码

    
    import (
        "fmt"
        "github.com/nfnt/resize"
        "image"
        _ "image/gif"
        _ "image/jpeg"
        "image/png"
        "math"
        "os"
        "path/filepath"
        "time"
    )
    
    const DEFAULT_MAX_WIDTH float64 = 320
    const DEFAULT_MAX_HEIGHT float64 = 240
    
    // 计算图片缩放后的尺寸
    func calculateRatioFit(srcWidth, srcHeight int) (int, int) {
        ratio := math.Min(DEFAULT_MAX_WIDTH/float64(srcWidth), DEFAULT_MAX_HEIGHT/float64(srcHeight))
        return int(math.Ceil(float64(srcWidth) * ratio)), int(math.Ceil(float64(srcHeight) * ratio))
    }
    
    // 生成缩略图
    func makeThumbnail(imagePath, savePath string) (string, error) {
        
        file, _ := os.Open(imagePath)
        defer file.Close()
    
        img, _, err := image.Decode(file)
        if err != nil {
            return err
        }
    
        b := img.Bounds()
        width := b.Max.X
        height := b.Max.Y
    
        w, h := calculateRatioFit(width, height)
    
        fmt.Println("width = ", width, " height = ", height)
        fmt.Println("w = ", w, " h = ", h)
    
        // 调用resize库进行图片缩放
        m := resize.Resize(uint(w), uint(h), img, resize.Lanczos3)
    
        // 需要保存的文件
        imgfile, _ := os.Create(savePath)
        defer imgfile.Close()
    
        // 以PNG格式保存文件
        err = png.Encode(imgfile, m)
        if err != nil {
            return err
        }
    
        return nil
    }
    

    相关文章

      网友评论

          本文标题:Golang获取图片尺寸并生成缩略图

          本文链接:https://www.haomeiwen.com/subject/iiuozxtx.html