Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 从HTTP响应体检索图像_Image_Http_Go_Get - Fatal编程技术网

Image 从HTTP响应体检索图像

Image 从HTTP响应体检索图像,image,http,go,get,Image,Http,Go,Get,我试图通过客户端服务中的HTTP GET请求从服务器检索图像。 我用以下代码复制了我的用例: main.go: package main import ( "net/http" "os" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" ) func main() { log.SetFormatter(&log.TextFormatter{}) // Initiali

我试图通过客户端服务中的HTTP GET请求从服务器检索图像。 我用以下代码复制了我的用例:

main.go:

package main

import (
    "net/http"
    "os"

    "github.com/gorilla/mux"
    log "github.com/sirupsen/logrus"
)

func main() {
    log.SetFormatter(&log.TextFormatter{})

    // Initialize router
    router := mux.NewRouter()

    args := os.Args

    if args[1] == "client" {
        log.Print("Run Client, listening on port 8080")
        router.Methods("GET").Path("/image").HandlerFunc(ClientGetImage)
        log.Fatal(http.ListenAndServe(":8080", router))
    } else if args[1] == "server" {
        log.Print("Run Server, listening on port 4242")
        router.Methods("GET").Path("/image").HandlerFunc(ServerGetImage)
        log.Fatal(http.ListenAndServe(":4242", router))
    } else {
        log.Fatal("Wrong command. Choose [client] or [server] option")
    }
}
client.go:

package main

import (
    "image"
    "log"
    "net/http"
)

func ClientGetImage(w http.ResponseWriter, r *http.Request) {
    // Make HTTP Get request to retrieve the image from the server
    log.Print("Requesting image to server")
    resp, err := http.Get("http://localhost:4242/image")

    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    m, _, err := image.Decode(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    log.Print("Pixels: ", m)
}
server.go:

package main

import (
    "bytes"
    "image"
    "image/color"
    "image/jpeg"
    "log"
    "net/http"
    "strconv"
)

func ServerGetImage(w http.ResponseWriter, r *http.Request) {
    img := image.NewGray16(image.Rect(0, 0, 1, 1))
    img.SetGray16(0, 0, color.Gray16{Y: 42000})

    // Print created
    log.Print("Pixels: ", img)

    buffer := new(bytes.Buffer)
    if err := jpeg.Encode(buffer, img, nil); err != nil {
        log.Println("unable to encode image.")
    }

    w.Header().Set("Content-Type", "image/jpeg")
    w.Header().Set("Content-Length", strconv.Itoa(len(buffer.Bytes())))
    if _, err := w.Write(buffer.Bytes()); err != nil {
        log.Println("unable to write image.")
    }
}
其目的非常简单:在接收到GET请求后,客户机向服务器发送GET请求以检索图像。 在接收到客户机的GET请求后,服务器创建一个1x1图像,编码为16位

运行客户端和服务器后,当我向客户端发送my GET请求时,我会得到以下日志:

服务器日志:

INFO[0000] Run Server, listening on port 4242           
2019/09/30 15:32:05 Pixels: &{[164 16] 2 (0,0)-(1,1)}
客户端日志:

INFO[0000] Run Client, listening on port 8080           
2019/09/30 15:41:52 Requesting image to server
2019/09/30 15:41:52 Pixels: &{[164 164 164 164 164 164 164 164 164 164 164 164 164 164 164
 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1
64 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164
 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1
64 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164
 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1
64 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164
 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1
64 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164
 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 1
64 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164
 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164] [128 128 128 128 128 128
 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 1
28 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128
 128 128 128 128 128 128 128 128 128 128 128 128 128] [128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128] 16 8 YCbCrSubsampleRatio420 (0,0)-(1,1)}
我希望客户会打印: 像素:&{[16416]2(0,0)-(1,1)} 也
这只是打印格式的不同,还是图像没有正确解码?

谢谢Cerise Limon,我不知道解码图像是YCbCr。 如果我尝试转换为灰度16图像,它会提供预期的输出格式。 现在清楚多了

事实上,这与HTTP无关。。我写了一段更简单的代码:


    // Create a 2x1 Gray16 image
    img := image.NewGray16(image.Rect(0, 0, 2, 1))
    // Set 1st pixel to 42
    img.SetGray16(0, 0, color.Gray16{Y: 42})

    log.Print("Pixels: ", img)

    // Encode the image
    buffer := new(bytes.Buffer)
    jpeg.Encode(buffer, img, &jpeg.Options{Quality: 100})

    // Decode the encoded buffer
    m, _ := jpeg.Decode(buffer)

    // Create a Gray16 image and fill it with decoded image
    newImage := image.NewGray16(image.Rect(0, 0, m.Bounds().Dx(), m.Bounds().Dy()))
    draw.Draw(newImage, newImage.Bounds(), m, m.Bounds().Min, draw.Src)

    log.Print("Pixels: ", newImage)
这为我提供了以下输出:

INFO[0000] Pixels: &{[0 42 0 0] 4 (0,0)-(2,1)}          
INFO[0000] Pixels: &{[0 0 0 0] 4 (0,0)-(2,1)}
请注意,如果我将Gray16替换为Gray,编码/解码似乎工作正常:我得到的输出图像与输入图像相同

我是不是遗漏了什么?
谢谢

我在这里没有看到任何错误输出。到底是什么问题?编码后的图像是图像。灰色16。解码后的图像是image.YCbCr。这些图像类型具有不同的表示形式,因此打印方式不同。从JPEG解码将始终返回一个image.YCbCr。请注意,这与HTTP和所有这些复杂问题完全无关。“我正试图通过HTTP GET请求在客户端和服务器之间发送图像”——这是不可能的。要将图像从客户端发送到服务器,必须使用POST或PUT,因为GET请求没有正文。@Flimzy问题中的文字可以更清楚地说明请求的方向,但代码清楚地显示客户端正在从服务器获取图像。