gpt4 book ai didi

image - 在刚刚创建的 Go 中提供图像

转载 作者:IT王子 更新时间:2023-10-29 01:22:54 25 4
gpt4 key购买 nike

当图像不存在时,我正在动态创建图像。 IE example_t500.jpg 请求时将从 example.jpg 创建。我遇到的问题是在显示丢失的图像之前请求时显示创建的图像。

代码:

package main

import (
"image/jpeg"
"net/http"
"log"
"os"
"strings"
"fmt"
"strconv"
resizer "github.com/nfnt/resize"
)

func WebHandler (w http.ResponseWriter, r *http.Request) {
var Path = "../../static/img/photos/2014/11/4/test.jpg"
ResizeImage(Path, 500)
http.Handle("/", http.FileServer(http.Dir("example_t500.jpg")))
}

func ResizeImage (Path string, Width uint) {
var ImageExtension = strings.Split(Path, ".jpg")
var ImageNum = strings.Split(ImageExtension[0], "/")
var ImageName = ImageNum[len(ImageNum)-1]
fmt.Println(ImageName)
file, err := os.Open(Path)
if err != nil {
log.Fatal(err)
}

img, err := jpeg.Decode(file)
if err != nil {
log.Fatal(err)
}
file.Close()

m := resizer.Resize(Width, 0, img, resizer.Lanczos3)

out, err := os.Create(ImageName + "_t" + strconv.Itoa(int(Width)) + ".jpg")
if err != nil {
log.Fatal(err)
}
defer out.Close()

jpeg.Encode(out, m, nil)
}

func main() {
http.HandleFunc("/", WebHandler)
http.ListenAndServe(":8080", nil)
}

这是我第一次尝试使用 Go,但在渲染图像时遇到了问题。感谢您的帮助。

最佳答案

您需要做一些事情。

首先,您需要从 WebHandler 函数中删除这一行:

http.Handle("/", http.FileServer(http.Dir("example_t500.jpg")))

那是设置默认服务 mux 来处理根路由 - 但您已经在此处的 main 函数中完成了该操作:

http.HandleFunc("/", WebHandler)

因此,每次您访问根路由时,您实际上只是在告诉 servemux 再次处理它......但有所不同。

你想要做的是..设置响应的Content-Type header ..然后将文件的内容复制到响应流。像这样:

func WebHandler (w http.ResponseWriter, r *http.Request) {
var Path = "../../static/img/photos/2014/11/4/test.jpg"
ResizeImage(Path, 500)

img, err := os.Open("example_t500.jpg")
if err != nil {
log.Fatal(err) // perhaps handle this nicer
}
defer img.Close()
w.Header().Set("Content-Type", "image/jpeg") // <-- set the content-type header
io.Copy(w, img)
}

那是手动版本。还有 http.ServeFile .

编辑:

作为对您评论的回应 - 如果您根本不想编写文件而只是动态地提供它,那么您需要做的就是将 http.ResponseWriter 传递给 编码方法。 jpeg.Encode 采用 io.Writer .. 就像 io.Copy 在我的原始示例中所做的那样:

// Pass in the ResponseWriter
func ResizeImage (w io.Writer, Path string, Width uint) {
var ImageExtension = strings.Split(Path, ".jpg")
var ImageNum = strings.Split(ImageExtension[0], "/")
var ImageName = ImageNum[len(ImageNum)-1]
fmt.Println(ImageName)
file, err := os.Open(Path)
if err != nil {
log.Fatal(err)
}

img, err := jpeg.Decode(file)
if err != nil {
log.Fatal(err)
}
file.Close()

m := resizer.Resize(Width, 0, img, resizer.Lanczos3)

// Don't write the file..
/*out, err := os.Create(ImageName + "_t" + strconv.Itoa(int(Width)) + ".jpg")
if err != nil {
log.Fatal(err)
}
defer out.Close()*/

jpeg.Encode(w, m, nil) // Write to the ResponseWriter
}

在方法中接受 io.Writer .. 然后将其编码为该方法。然后您可以像这样调用您的方法:

func WebHandler (w http.ResponseWriter, r *http.Request) {
var Path = "../../static/img/photos/2014/11/4/test.jpg"
ResizeImage(w, Path, 500) // pass the ResponseWriter in
}

关于image - 在刚刚创建的 Go 中提供图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com