// Take a folder name, read all the images within, and return them in an array. func ReadImageFolder(path string, log *golog.Logger) (images []Image, err error) { dir, err := os.Open(path) if err != nil { log.Errorf("Couldn't open folder '%s'", path) return nil, err } else { defer dir.Close() } dirInfo, err := dir.Stat() if err != nil { log.Errorf("Couldn't gather information for folder '%s'", path) return nil, err } if !dirInfo.IsDir() { // just ignore the request if it isn't a folder return nil, nil } names, err := dir.Readdirnames(0) if err != nil { log.Errorf("Problem gathering names of image files in '%s'", path) return nil, err } // put these in a canonical order, otherwise it'll be platform-specific sort.Strings(names) images = make([]Image, 0) for _, name := range names { fullName := filepath.Join(path, name) imgFile, err := os.Open(fullName) if err != nil { log.Errorf("Couldn't open image file '%s'", fullName) continue } else { defer imgFile.Close() } imgInfo, err := imgFile.Stat() if err != nil { log.Errorf("Couldn't gather information for image file '%s'", fullName) } if imgInfo.IsDir() { // skip non-files continue } ext := strings.ToLower(filepath.Ext(name)) if ext == ".png" { img, err := png.Decode(imgFile) if err != nil { log.Errorf("Problem decoding png image in '%s'", fullName) continue } name = name[0 : len(name)-len(ext)] images = append(images, Image{name, img}) } else if ext == ".jpg" || ext == ".jpeg" { img, err := jpeg.Decode(imgFile) if err != nil { log.Errorf("Problem decoding jpeg image in '%s'", fullName) continue } name = name[0 : len(name)-len(ext)] images = append(images, Image{name, img}) } else { log.Debugf("Ignoring unrecognized file '%s'", fullName) } } if len(images) == 0 { log.Warningf("Folder '%s' contains no images; no sprite-sheet will be generated", path) } return images, nil }