這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
直接貼代碼了
package mainimport ( "errors" "fmt" "image" "image/gif" "image/jpeg" "image/png" "io" "os" "strings" "golang.org/x/image/bmp" "github.com/nfnt/resize")func main() { src := "data/1.gif" dst := strings.Replace(src, ".", "_small.", 1) fmt.Println("src=", src, " dst=", dst) fIn, _ := os.Open(src) defer fIn.Close() fOut, _ := os.Create(dst) defer fOut.Close() // err := clip(fIn, fOut, 0, 0, 150, 150, 100) // if err != nil { // panic(err) // } err := scale(fIn, fOut, 150, 150, 100) if err != nil { panic(err) }}/** 圖片裁剪* 入參:* 規則:如果精度為0則精度保持不變** 返回:error */func clip(in io.Reader, out io.Writer, x0, y0, x1, y1, quality int) error { origin, fm, err := image.Decode(in) if err != nil { return err } switch fm { case "jpeg": img := origin.(*image.YCbCr) subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.YCbCr) return jpeg.Encode(out, subImg, &jpeg.Options{quality}) case "png": switch canvas.(type) { case *image.NRGBA: img := canvas.(*image.NRGBA) subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.NRGBA) return png.Encode(out, subImg) case *image.RGBA: img := canvas.(*image.RGBA) subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.RGBA) return png.Encode(out, subImg) } case "gif": img := origin.(*image.Paletted) subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.Paletted) return gif.Encode(out, subImg, &gif.Options{}) case "bmp": img := origin.(*image.RGBA) subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.RGBA) return bmp.Encode(out, subImg) default: return errors.New("ERROR FORMAT") } return nil}/** 縮圖產生* 入參:* 規則: 如果width 或 hight其中有一個為0,則大小不變 如果精度為0則精度保持不變* 矩形座標系起點是左上* 返回:error */func scale(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) //return jpeg.Encode(out, canvas, &jpeg.Options{quality}) 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}