杜松子酒:在发送之前调整图片大小

时间:2019-06-01 22:30:23

标签: go gin

我希望有一条带有gin的路由,该路由将发送图像(jpeg)作为响应,但与其发送已保存到磁盘的原始图像,不如我想先将其调整为缩略图大小。

到目前为止,我可以使用c.File(filepath string)发送图像,但这不能调整图像的大小。有什么方法可以不必在磁盘上创建新文件吗?

1 个答案:

答案 0 :(得分:0)

是的,您可以使用内置软件包"image"来调整它的大小,我只是为您构建了它,具有不同的调整大小选项和字节数/纯图像输出,选择您想要的东西。我过去没有使用过这个特殊的程序包,因此欢迎对此代码的任何修正/建议。代码:

package main

import (
    "bytes"
    "fmt"
    "image"
    "image/color"
    "image/draw"
    "image/jpeg"
    "io/ioutil"
    "log"
    "os"
)

func main() {
    f, err := os.Open("resources/image.jpg")
    if err != nil {
        log.Fatal(err)
    }

    img, str, err := image.Decode(f)
    if err != nil {
        log.Fatal(err)
    }
    //encoding message is discarded, because OP wanted only jpg, else use encoding in resize function
    fmt.Println(str)

    //this is the resized image
    resImg := resize(img, 3)

    //this is the resized image []bytes
    imgBytes := imgToBytes(resImg)

    //optional written to file
    err = ioutil.WriteFile("resources/test.jpg", imgBytes, 0777)
    if err != nil {
        log.Fatal(err)
    }
}

func resize(img image.Image, scale int) image.Image {
    imgRect := image.Rect(img.Bounds().Min.X/scale, img.Bounds().Min.Y/scale, img.Bounds().Max.X/scale, img.Bounds().Max.Y/scale)
    resImg := image.NewRGBA(imgRect)
    draw.Draw(resImg, resImg.Bounds(), &image.Uniform{C: color.White}, image.ZP, draw.Src)
    for y := img.Bounds().Min.Y; y < img.Bounds().Max.Y; y += scale {
        for x := img.Bounds().Min.X; x < img.Bounds().Max.X; x += scale {
            resImg.Set(x/scale, y/scale, img.At(x, y))
        }
    }

    return resImg
}

func imgToBytes(img image.Image) []byte {
    var opt jpeg.Options
    opt.Quality = 80

    buff := bytes.NewBuffer(nil)
    err := jpeg.Encode(buff, img, &opt) // put quality to 80%
    if err != nil {
        log.Fatal(err)
    }

    return buff.Bytes()
}