123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- package imaging
- import (
- "image"
- )
- // Rotate90 rotates the image 90 degrees counterclockwise and returns the transformed image.
- func Rotate90(img image.Image) *image.NRGBA {
- src := toNRGBA(img)
- srcW := src.Bounds().Max.X
- srcH := src.Bounds().Max.Y
- dstW := srcH
- dstH := srcW
- dst := image.NewNRGBA(image.Rect(0, 0, dstW, dstH))
- parallel(dstH, func(partStart, partEnd int) {
- for dstY := partStart; dstY < partEnd; dstY++ {
- for dstX := 0; dstX < dstW; dstX++ {
- srcX := dstH - dstY - 1
- srcY := dstX
- srcOff := srcY*src.Stride + srcX*4
- dstOff := dstY*dst.Stride + dstX*4
- copy(dst.Pix[dstOff:dstOff+4], src.Pix[srcOff:srcOff+4])
- }
- }
- })
- return dst
- }
- // Rotate180 rotates the image 180 degrees counterclockwise and returns the transformed image.
- func Rotate180(img image.Image) *image.NRGBA {
- src := toNRGBA(img)
- srcW := src.Bounds().Max.X
- srcH := src.Bounds().Max.Y
- dstW := srcW
- dstH := srcH
- dst := image.NewNRGBA(image.Rect(0, 0, dstW, dstH))
- parallel(dstH, func(partStart, partEnd int) {
- for dstY := partStart; dstY < partEnd; dstY++ {
- for dstX := 0; dstX < dstW; dstX++ {
- srcX := dstW - dstX - 1
- srcY := dstH - dstY - 1
- srcOff := srcY*src.Stride + srcX*4
- dstOff := dstY*dst.Stride + dstX*4
- copy(dst.Pix[dstOff:dstOff+4], src.Pix[srcOff:srcOff+4])
- }
- }
- })
- return dst
- }
- // Rotate270 rotates the image 270 degrees counterclockwise and returns the transformed image.
- func Rotate270(img image.Image) *image.NRGBA {
- src := toNRGBA(img)
- srcW := src.Bounds().Max.X
- srcH := src.Bounds().Max.Y
- dstW := srcH
- dstH := srcW
- dst := image.NewNRGBA(image.Rect(0, 0, dstW, dstH))
- parallel(dstH, func(partStart, partEnd int) {
- for dstY := partStart; dstY < partEnd; dstY++ {
- for dstX := 0; dstX < dstW; dstX++ {
- srcX := dstY
- srcY := dstW - dstX - 1
- srcOff := srcY*src.Stride + srcX*4
- dstOff := dstY*dst.Stride + dstX*4
- copy(dst.Pix[dstOff:dstOff+4], src.Pix[srcOff:srcOff+4])
- }
- }
- })
- return dst
- }
- // FlipH flips the image horizontally (from left to right) and returns the transformed image.
- func FlipH(img image.Image) *image.NRGBA {
- src := toNRGBA(img)
- srcW := src.Bounds().Max.X
- srcH := src.Bounds().Max.Y
- dstW := srcW
- dstH := srcH
- dst := image.NewNRGBA(image.Rect(0, 0, dstW, dstH))
- parallel(dstH, func(partStart, partEnd int) {
- for dstY := partStart; dstY < partEnd; dstY++ {
- for dstX := 0; dstX < dstW; dstX++ {
- srcX := dstW - dstX - 1
- srcY := dstY
- srcOff := srcY*src.Stride + srcX*4
- dstOff := dstY*dst.Stride + dstX*4
- copy(dst.Pix[dstOff:dstOff+4], src.Pix[srcOff:srcOff+4])
- }
- }
- })
- return dst
- }
- // FlipV flips the image vertically (from top to bottom) and returns the transformed image.
- func FlipV(img image.Image) *image.NRGBA {
- src := toNRGBA(img)
- srcW := src.Bounds().Max.X
- srcH := src.Bounds().Max.Y
- dstW := srcW
- dstH := srcH
- dst := image.NewNRGBA(image.Rect(0, 0, dstW, dstH))
- parallel(dstH, func(partStart, partEnd int) {
- for dstY := partStart; dstY < partEnd; dstY++ {
- for dstX := 0; dstX < dstW; dstX++ {
- srcX := dstX
- srcY := dstH - dstY - 1
- srcOff := srcY*src.Stride + srcX*4
- dstOff := dstY*dst.Stride + dstX*4
- copy(dst.Pix[dstOff:dstOff+4], src.Pix[srcOff:srcOff+4])
- }
- }
- })
- return dst
- }
|