[go] Go 언어를 이용한 이미지 처리

Go 언어는 강력한 이미지 처리 라이브러리들을 제공하여 이미지를 처리 및 조작하는데 매우 유용합니다. 이 블로그 포스트에서는 Go 언어를 사용하여 이미지를 로드하고 수정하는 예제 코드를 제공하겠습니다.

이미지 로드하기

Go 언어에서 이미지를 로드하기 위해서는 image 패키지를 이용합니다. 아래의 코드는 이미지 파일을 로드하고 저장하는 예제입니다.

package main

import (
	"fmt"
	"image"
	_ "image/jpeg"
	_ "image/png"
	"os"
)

func main() {
	// 이미지 파일 열기
	file, err := os.Open("input.jpg")
	if err != nil {
		fmt.Println("이미지 파일을 열 수 없습니다.")
		return
	}
	defer file.Close()

	// 이미지 디코더로 이미지 파일 읽어오기
	img, _, err := image.Decode(file)
	if err != nil {
		fmt.Println("이미지 파일을 읽어올 수 없습니다.")
		return
	}

	// 이미지 정보 출력
	bounds := img.Bounds()
	fmt.Println("이미지 크기:", bounds.Dx(), "x", bounds.Dy())
}

이 예제에서는 image/jpegimage/png 패키지를 사용하여 JPEG와 PNG 형식의 이미지 파일을 읽어옵니다. 이미지 파일의 경로는 os.Open 함수를 이용하여 열고, image.Decode 함수를 사용하여 이미지를 읽어옵니다. 읽어온 이미지의 정보는 bounds 변수에 저장되며, bounds.Dx()bounds.Dy() 함수를 통해 이미지의 가로와 세로 크기를 출력합니다.

이미지 수정하기

Go 언어로 이미지를 수정하는 경우 image 패키지의 다양한 함수와 메서드를 활용할 수 있습니다. 아래의 코드는 이미지를 회전시키고 그레이스케일로 변환하는 예제입니다.

package main

import (
	"fmt"
	"image"
	_ "image/jpeg"
	_ "image/png"
	"image/draw"
	"image/color"
	"os"
)

func main() {
	// 이미지 파일 열기
	file, err := os.Open("input.jpg")
	if err != nil {
		fmt.Println("이미지 파일을 열 수 없습니다.")
		return
	}
	defer file.Close()

	// 이미지 디코더로 이미지 파일 읽어오기
	img, _, err := image.Decode(file)
	if err != nil {
		fmt.Println("이미지 파일을 읽어올 수 없습니다.")
		return
	}

	// 회전시킬 각도 설정
	angle := 45.0

	// 이미지 회전
	rotatedImg := rotateImage(img, angle)

	// 그레이스케일로 변환
	grayImg := convertToGray(rotatedImg)

	// 결과 이미지 저장
	outputFile, err := os.Create("output.jpg")
	if err != nil {
		fmt.Println("이미지 파일을 저장할 수 없습니다.")
		return
	}
	defer outputFile.Close()

	// 이미지를 JPG 형식으로 저장
	jpeg.Encode(outputFile, grayImg, nil)
	fmt.Println("이미지가 성공적으로 저장되었습니다.")
}

// 이미지 회전 함수
func rotateImage(img image.Image, angle float64) *image.RGBA {
	bounds := img.Bounds()
	rotatedImg := image.NewRGBA(bounds)

	// 회전 중심 설정
	cx := float64(bounds.Dx()) / 2.0
	cy := float64(bounds.Dy()) / 2.0

	for x := 0; x < bounds.Dx(); x++ {
		for y := 0; y < bounds.Dy(); y++ {
			// 회전 좌표 계산
			rx := float64(x) - cx
			ry := float64(y) - cy
			newX := cx + rx*rotateCos(angle) - ry*rotateSin(angle)
			newY := cy + rx*rotateSin(angle) + ry*rotateCos(angle)

			// 회전된 좌표의 색상 가져오기
			rotatedImg.Set(int(newX), int(newY), img.At(x, y))
		}
	}

	return rotatedImg
}

// 그레이스케일로 변환하는 함수
func convertToGray(img image.Image) *image.Gray {
	bounds := img.Bounds()
	grayImg := image.NewGray(bounds)
	draw.Draw(grayImg, grayImg.Bounds(), img, bounds.Min, draw.Src)

	return grayImg
}

// 각도에 대한 코사인 계산
func rotateCos(angle float64) float64 {
	return math.Cos(angle * (math.Pi / 180))
}

// 각도에 대한 사인 계산
func rotateSin(angle float64) float64 {
	return math.Sin(angle * (math.Pi / 180))
}

이 예제에서는 rotateImage 함수를 사용하여 이미지를 주어진 각도로 회전시키고, convertToGray 함수를 사용하여 회전된 이미지를 그레이스케일로 변환합니다. 최종적으로 jpeg.Encode 함수를 이용하여 결과 이미지를 JPG 형식으로 저장합니다.

결론

Go 언어를 이용하여 이미지를 처리하는 방법에 대해 알아보았습니다. image 패키지의 다양한 기능을 활용하여 이미지 파일의 로드, 수정 및 저장을 할 수 있습니다. 이미지 처리에 대한 좀 더 자세한 내용은 Go 언어 공식 문서와 관련 문헌들을 참고하시기 바랍니다.