使用golang获取图像大小

b0zn9rqh  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(514)

我是golang的新手,我正在尝试获取目录中列出的所有图片的图片大小。这就是我所做的

package main

import (
    "fmt"
    "image"
    _ "image/jpeg"
    "io/ioutil"
    "os"
)

const dir_to_scan string = "/home/da/to_merge"

func main() {
    files, _ := ioutil.ReadDir(dir_to_scan)
    for _, filepath := range files {

        if reader, err := os.Open(filepath.Name()); err != nil {
            defer reader.Close()
            im, _, err := image.DecodeConfig(reader)
            if err != nil {
                fmt.Fprintf(os.Stderr, "%s: %v\n", filepath.Name(), err)
                continue
            }
            fmt.Printf("%s %d %d\n", filepath.Name(), im.Width, im.Height)
        } else {
            fmt.Println("Impossible to open the file")
        }
    }
}

我遇到了一个关于image.DecodeConfig的错误,它说image: unknown format有人知道正确的方法吗?在这里的文档中,http://golang.org/src/pkg/image/format.go?s=2676:2730#L82说我应该传递一个io.Reader作为参数,这就是我正在做的。

pjngdqdw

pjngdqdw1#

您的程式码有两个问题。
第一个是你已经把测试的err != nil反转了,所以你试着解码图像只有在你有错误的情况下,它应该是err == nil
第二个,正如jimt所说的,就是你使用filepath.Name(),它只包含os.Open()中的文件名,这就是为什么err总是被设置,因此总是进入if,并解码一个不存在的文件。
下面是更正后的代码:

package main

import (
    "fmt"
    "image"
    _ "image/jpeg"
    "io/ioutil"
    "os"
    "path/filepath"
)

const dir_to_scan string = "/home/da/to_merge"

func main() {
    files, _ := ioutil.ReadDir(dir_to_scan)
    for _, imgFile := range files {

        if reader, err := os.Open(filepath.Join(dir_to_scan, imgFile.Name())); err == nil {
            defer reader.Close()
            im, _, err := image.DecodeConfig(reader)
            if err != nil {
                fmt.Fprintf(os.Stderr, "%s: %v\n", imgFile.Name(), err)
                continue
            }
            fmt.Printf("%s %d %d\n", imgFile.Name(), im.Width, im.Height)
        } else {
            fmt.Println("Impossible to open the file:", err)
        }
    }
}

另外,如果你的目录中有其他的图像格式,不要忘记添加image/jpeg以外的其他导入。

svmlkihl

svmlkihl2#

如果你想通过使用image.decode(reader)而不使用image.decodeConfig来获取图像的宽度和高度

m, _, err := image.Decode(reader)
if err != nil {
    log.Fatal(err)
}
bounds := m.Bounds()
w := bounds.Dx()
h := bounds.Dy()

fmt.Printf("width: %d, height: %d\n", w, h)

相关问题