예제 #1
0
파일: img.go 프로젝트: zaolab/sunnified
func SaveThumbnailAndImage(imgr io.ReadSeeker, maxw, maxh int, tdir, dir, fname string) (tname, name string, err error) {
	var resized bool
	tname, resized, err = saveThumbnail(imgr, maxw, maxh, tdir, fname)
	if err != nil {
		return
	}

	var source io.Reader
	var file *os.File

	if resized {
		imgr.Seek(0, 0)
		var s224 = sha256.New224()
		if _, err = io.Copy(s224, imgr); err != nil {
			return
		}

		hash := make([]byte, 0, sha256.Size224)
		hash = s224.Sum(hash)
		name = fmt.Sprintf("%x%s", hash, path.Ext(tname))
		imgr.Seek(0, 0)

		if _, err = os.Stat(dir + name); err == nil {
			return
		} else if !os.IsNotExist(err) {
			return
		}
		source = imgr
	} else {
		var sourcefile *os.File
		if sourcefile, err = os.Open(util.AddDirTrailSlash(tdir) + tname); err != nil {
			return
		}
		defer sourcefile.Close()
		source = sourcefile
		name = tname
	}

	if file, err = os.Create(dir + name); err != nil {
		return
	}
	defer file.Close()

	_, err = io.Copy(file, source)
	return
}
예제 #2
0
파일: img.go 프로젝트: zaolab/sunnified
func saveThumbnail(imgr io.ReadSeeker, maxw, maxh int, dir, fname string) (name string, resized bool, err error) {
	dir = util.AddDirTrailSlash(dir)
	fname = strings.TrimSpace(fname)

	var (
		img  image.Image
		imgf string
		imgc image.Config
		file *os.File
		rdr  io.Reader = imgr
	)

	if imgc, imgf, err = image.DecodeConfig(imgr); err != nil {
		return
	}

	if imgf == "jpeg" {
		imgf = "jpg"
	}

	if imgc.Width*imgc.Height > 100000000 {
		// image is bigger than 100megapixels
		err = ErrImageExceedSize
		return
	} else if imgc.Width > maxw || imgc.Height > maxh {
		imgr.Seek(0, 0)
		if img, _, err = image.Decode(imgr); err != nil {
			return
		}

		img = resize.Thumbnail(uint(maxw), uint(maxh), img, resize.Bicubic)
		resized = true
	}

	if fname == "" {
		var s224 = sha256.New224()

		if img != nil {
			buf := &bytes.Buffer{}
			writer := io.MultiWriter(s224, buf)

			if err = EncodeImg(writer, img, imgf); err != nil {
				return
			}

			img = nil
			rdr = buf
		} else {
			if _, err = io.Copy(s224, imgr); err != nil {
				return
			}

			imgr.Seek(0, 0)
		}

		hash := make([]byte, 0, sha256.Size224)
		hash = s224.Sum(hash)
		name = fmt.Sprintf("%x.%s", hash, imgf)

		if _, err = os.Stat(dir + name); err == nil {
			return
		} else if !os.IsNotExist(err) {
			return
		}
	} else {
		name = fname + "." + imgf

		if _, err = os.Stat(dir + name); err == nil {
			err = os.ErrExist
			return
		} else if !os.IsNotExist(err) {
			return
		}

	}

	if file, err = os.Create(dir + name); err != nil {
		return
	}
	defer file.Close()

	if img != nil {
		EncodeImg(file, img, imgf)
	} else {
		_, err = io.Copy(file, rdr)
	}

	return
}