登录
首页 >  Golang >  Go问答

检测Go程序管道输入文件的图像或gif类型

来源:stackoverflow

时间:2024-02-26 11:57:25 179浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《检测Go程序管道输入文件的图像或gif类型》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

我有一个 cli 工具,它接受文件路径或 url(可以是 gif 或图像)形式的输入。目前,我通过扩展名(.gif.jpg 等在路径末尾)来区分两者,但如果输入是从不同进程中通过管道传输的,我很难做到这一点。命令行。

例如,mygoprogram 如何知道下面示例中的管道输入是 .png 还是 .gif

cat image.png | ./mygoprogram -

以下是我现在如何使用 image go 模块解码图像的管道标准输入:

decodedimg, _, err := image.decode(os.stdin)

...通过 image/gif go 模块解码 gif 也是如此:

decodedGif, err = gif.DecodeAll(os.Stdin)

但我不明白我应该如何知道它是 gif 还是来自 os.stdin 的图像


正确答案


@mkopriva提到的问题的帮助下找到了解决方案

我如何区分图像、gif 和无效输入的总体逻辑:

// imports:
import (
    "io/ioutil"
    "log"
    "net/http"
    "os"
)

// -----
// logic:
var pipedInputTypes = []string{
    "image/png",
    "image/jpeg",
}
var inputIsGif bool

pipedInputBytes, err := ioutil.ReadAll(os.Stdin)
if err != nil {
    log.Fatalf("Unable to read piped input: %v", err)
}

fileType := http.DetectContentType(pipedInputBytes)
invalidInput := true

if fileType == "image/gif" {
    inputIsGif = true
    invalidInput = false
} else {
    for _, inputType := range pipedInputTypes {
        if fileType == inputType {
            invalidInput = false
            break
        }
    }
}

if invalidInput {
    log.Fatalf("Cannot read piped input of type \"%v\"", fileType)
}

if inputIsGif {
    // Gif program logic with pipedInputBytes
} else {
    // Image program logic with pipedInputBytes
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>