GO多张图片拼成大图

/*源目录  目标文件名  目标图片单张宽  目标图片单张高  目标图片总行数  目标图片总列数*/

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

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值