英文:
Get image size with 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("无法打开文件")
}
}
}
当使用image.DecodeConfig
时,我遇到了一个错误,提示image: unknown format
。有人知道正确的方法吗?在这里的文档中http://golang.org/src/pkg/image/format.go?s=2676:2730#L82中说我应该传递一个io.Reader
作为参数,这就是我正在做的。
英文:
I'm new to golang and I'm trying to get the image size of all the images listed in a directory. That's what I've done
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")
}
}
}
I've an error when it comes to image.DecodeConfig
, that says image: unknown format
Has someone an idea about the proper way to do it?
In the docs here http://golang.org/src/pkg/image/format.go?s=2676:2730#L82 says that i should pass a io.Reader
as argument, and that's what i'm doing.
答案1
得分: 12
你的代码有两个问题。
第一个问题是你颠倒了测试条件err != nil
,所以你只在出现错误的情况下尝试解码图像。应该是err == nil
。
第二个问题,正如jimt所说,你在os.Open()
中使用了filepath.Name()
,它只包含文件名,这导致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("无法打开文件:", err)
}
}
}
另外,如果你的目录中有其他图像格式,请不要忘记添加除image/jpeg
之外的其他导入项。
英文:
There are two problems with your code.
The first one is that you have inverted the test err != nil
, so you try to decode the image only in the case where you have an error. It should be err == nil
.
The second one, as said by jimt, is that you use filepath.Name()
, which contains only the file name in os.Open()
, this is what makes err
to always be set, thus always entering in the if
, and decoding a file that doesn't exists.
Here is the corrected code :
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)
}
}
}
Also, don't forget to add other imports than image/jpeg
if you have other images formats in your dir.
答案2
得分: 3
如果你想在不使用image.DecodeConfig的情况下通过image.Decode(reader)获取图像的宽度和高度,可以使用以下代码:
m, _, err := image.Decode(reader)
if err != nil {
log.Fatal(err)
}
bounds := m.Bounds()
w := bounds.Dx()
h := bounds.Dy()
fmt.Printf("宽度:%d,高度:%d\n", w, h)
这段代码将读取图像并解码,然后使用Bounds()方法获取图像的边界信息,最后通过Dx()和Dy()方法获取宽度和高度。
英文:
In case if you want to get width and height of image by use image.Decode(reader) without 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)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论