Ejemplo n.º 1
0
// 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
}