github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/app/imaging/orientation.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package imaging
     5  
     6  import (
     7  	"image"
     8  	"io"
     9  
    10  	"github.com/disintegration/imaging"
    11  	"github.com/rwcarlsen/goexif/exif"
    12  )
    13  
    14  const (
    15  	/*
    16  	  EXIF Image Orientations
    17  	  1        2       3      4         5            6           7          8
    18  
    19  	  888888  888888      88  88      8888888888  88                  88  8888888888
    20  	  88          88      88  88      88  88      88  88          88  88      88  88
    21  	  8888      8888    8888  8888    88          8888888888  8888888888          88
    22  	  88          88      88  88
    23  	  88          88  888888  888888
    24  	*/
    25  	Upright = iota + 1
    26  	UprightMirrored
    27  	UpsideDown
    28  	UpsideDownMirrored
    29  	RotatedCWMirrored
    30  	RotatedCCW
    31  	RotatedCCWMirrored
    32  	RotatedCW
    33  )
    34  
    35  // MakeImageUpright changes the orientation of the given image.
    36  func MakeImageUpright(img image.Image, orientation int) image.Image {
    37  	switch orientation {
    38  	case UprightMirrored:
    39  		return imaging.FlipH(img)
    40  	case UpsideDown:
    41  		return imaging.Rotate180(img)
    42  	case UpsideDownMirrored:
    43  		return imaging.FlipV(img)
    44  	case RotatedCWMirrored:
    45  		return imaging.Transpose(img)
    46  	case RotatedCCW:
    47  		return imaging.Rotate270(img)
    48  	case RotatedCCWMirrored:
    49  		return imaging.Transverse(img)
    50  	case RotatedCW:
    51  		return imaging.Rotate90(img)
    52  	default:
    53  		return img
    54  	}
    55  }
    56  
    57  // GetImageOrientation reads the input data and returns the EXIF encoded
    58  // image orientation.
    59  func GetImageOrientation(input io.Reader) (int, error) {
    60  	exifData, err := exif.Decode(input)
    61  	if err != nil {
    62  		return Upright, err
    63  	}
    64  
    65  	tag, err := exifData.Get("Orientation")
    66  	if err != nil {
    67  		return Upright, err
    68  	}
    69  
    70  	orientation, err := tag.Int(0)
    71  	if err != nil {
    72  		return Upright, err
    73  	}
    74  
    75  	return orientation, nil
    76  }