寻找更好的方法来保存在内存映像文件



代码的目标是下载一个图像,将其粘贴到一个更大的父图像上,并保存结果。

经过几次失败之后,我最终得到了下面可以工作的代码:

然而,有一个更好的方法比使用bytes.Bufferwriter保存目标图像到一个文件/传递给httpResponse?

package main
import (
    "image"
    "image/draw"
    "image/jpeg"
    "os"
    // "image/color"
    // "io/ioutil"
    // "fmt"
    "bufio"
    "bytes"
    "log"
    "net/http"
)
func main() {
    // Fetch an image.
    resp, err := http.Get("http://katiebrookekennels.com/wp-content/uploads/2014/10/dog-bone4.jpg")
    if err != nil {
        log.Panic(err)
    }
    defer resp.Body.Close()
    // Keep an in memory copy.
    myImage, err := jpeg.Decode(resp.Body)
    if err != nil {
        log.Panic(err)
    }
    // Prepare parent image where we want to position child image.
    target := image.NewRGBA(image.Rect(0, 0, 800, 800))
    // Draw white layer.
    draw.Draw(target, target.Bounds(), image.White, image.ZP, draw.Src)
    // Draw child image.
    draw.Draw(target, myImage.Bounds(), myImage, image.Point{0, 0}, draw.Src)
    // Encode to jpeg.
    var imageBuf bytes.Buffer
    err = jpeg.Encode(&imageBuf, target, nil)
    if err != nil {
        log.Panic(err)
    }
    // Write to file.
    fo, err := os.Create("img.jpg")
    if err != nil {
        panic(err)
    }
    fw := bufio.NewWriter(fo)
    fw.Write(imageBuf.Bytes())
}

jpeg.Encode()期望io.Writer将编码后的图像写入(JPEG格式)。*os.Filehttp.ResponseWriter也都实现了io.Writer,所以你可以直接传递一个文件或HTTP响应写入器,而不是bytes.Buffer

将图像直接保存到文件:

f, err := os.Create("img.jpg")
if err != nil {
    panic(err)
}
defer f.Close()
if err = jpeg.Encode(f, target, nil); err != nil {
    log.Printf("failed to encode: %v", err)
}

作为图片使用:

// w is of type http.ResponseWriter:
if err := jpeg.Encode(w, target, nil); err != nil {
    log.Printf("failed to encode: %v", err)
}

你可以在这些问题中看到一些例子(保存/加载JPEG和PNG图像):

在Golang?

如何在Go中添加简单的文本标签到图像?

更改单个像素的颜色- Golang图像

最新更新