/*源目录 目标文件名 目标图片单张宽 目标图片单张高 目标图片总行数 目标图片总列数*/
func MergeImage(sourceDir string,targetDir string,sourceWidth float64,sourceHight float64,targetCells float64,targetRows float64) {
//根据目标宽和高,行和列,计算新图片的高宽
targetWidth := targetCells * sourceWidth
targetHight := targetRows * sourceHight
//创建目标图
targetImage := image.NewRGBA(image.Rect(0, 0, int(targetWidth), int(targetHight)))
newImage_color := color.RGBA{0, 0, 0, 0}
draw.Draw(targetImage, targetImage.Bounds(), &image.Uniform{newImage_color}, image.ZP, draw.Src)
//图片N合一绘图
rd, err := ioutil.ReadDir(sourceDir)
if err != nil {
fmt.Println("读取图片失败:" + err.Error())
} else {
var fileIndex float64 = 1
for _, fi := range rd {
if !fi.IsDir() {
var fIn *os.File
var sourceImg image.Image
fIn, _ = os.Open(sourceDir + "/" + fi.Name())
defer fIn.Close()
//按照宽度和高度进行等比例缩放
resizePath := sourceDir + "/resize/" + fi.Name()
fOut, _ := os.Create(resizePath)
err = ResizeImage(fIn, fOut, int(sourceWidth), int(sourceHight), 100)
if err != nil {
fmt.Println("图片缩放失败:" + err.Error())
} else {
fIn, _ = os.Open(resizePath)
}
defer fOut.Close()
sourceImg, _, _ = image.Decode(fIn)
//图片的位置
currentRow := math.Ceil(fileIndex / targetCells)
currentCell := fileIndex - (currentRow-1)*targetCells
imageX := (currentCell - 1) * sourceWidth
imageY := (currentRow - 1) * sourceHight
fileIndex = fileIndex + 1
draw.Draw(targetImage, targetImage.Bounds().Add(image.Pt(int(imageX), int(imageY))), sourceImg, sourceImg.Bounds().Min, draw.Src)
}
}
outFile, err := os.Create(targetDir)
if err != nil {
fmt.Println("Create outputPath err:" + err.Error())
} else {
defer outFile.Close()
b := bufio.NewWriter(outFile)
err = png.Encode(b, targetImage)
if err != nil {
fmt.Println("png Encode err:" + err.Error())
} else {
err = b.Flush()
if err != nil {
fmt.Println("Flush err:" + err.Error())
}
}
}
}
}
func ResizeImage(in io.Reader, out io.Writer, width, height, quality int) error {
origin, fm, err := image.Decode(in)
if err != nil {
return err
}
if width == 0 || height == 0 {
width = origin.Bounds().Max.X
height = origin.Bounds().Max.Y
}
if quality == 0 {
quality = 100
}
canvas := resize.Thumbnail(uint(width), uint(height), origin, resize.Lanczos3)
switch fm {
case "jpeg":
return jpeg.Encode(out, canvas, &jpeg.Options{quality})
case "png":
return png.Encode(out, canvas)
case "gif":
return gif.Encode(out, canvas, &gif.Options{})
case "bmp":
return bmp.Encode(out, canvas)
default:
return errors.New("ERROR FORMAT")
}
return nil
}