【问题标题】:Looking for better way to save an in memory image to file寻找将内存图像保存到文件的更好方法
【发布时间】:2021-07-19 04:26:43
【问题描述】:

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

在多次失败后,我最终得到了以下有效的代码。

但是,有没有比使用 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())
}

【问题讨论】:

    标签: image go io


    【解决方案1】:

    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 图像):

    Draw a rectangle in Golang?

    How to add a simple text label to an image in Go?

    Change color of a single pixel - Golang image

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      相关资源
      最近更新 更多