🔥 연습문제 - image

364자
4분

이번에는 이전에 작성했던 그림 생성기를 기억하시나요? 이번에는 또 다른 그림 생성기를 작성해 보겠습니다. 하지만 이번에는 데이터 슬라이스 대신 image.Image 인터페이스를 구현한 값을 반환하도록 하겠습니다.

우선 여러분만의 Image 타입을 정의하고, 필요한 메서드들을 구현한 후에 pic.ShowImage를 호출해 보세요.

Bounds 메서드는 image.Rect(0, 0, w, h)와 같은 형태로 image.Rectangle을 반환해야 합니다.

ColorModel 메서드는 color.RGBAModel을 반환해야 합니다.

At 메서드는 색상을 반환해야 하는데, 이전 그림 생성기에서의 v 값은 이번 생성기에서는 color.RGBA{v, v, 255, 255}에 해당합니다.

아래는 시작 코드입니다:

package main
 
import "golang.org/x/tour/pic"
 
type Image struct{}
 
func main() {
	m := Image{}
	pic.ShowImage(m)
}
 
go

이제 Image 타입을 정의하고 필요한 메서드들을 구현해 봅시다. 우선 Image 타입에 Bounds, ColorModel, At 메서드를 추가합니다.

type Image struct{
    Width, Height int
}
 
func (i Image) Bounds() image.Rectangle {
    return image.Rect(0, 0, i.Width, i.Height)
}
 
func (i Image) ColorModel() color.Model {
    return color.RGBAModel
}
 
func (i Image) At(x, y int) color.Color {
    v := uint8((x + y) / 2)  // 이전 생성기의 v 값 계산
    return color.RGBA{v, v, 255, 255}
}
 
go

주석을 따라가면서 코드를 살펴봅시다:

type Image struct{
    Width, Height int  // 이미지의 가로, 세로 크기를 필드로 갖는 구조체를 정의합니다.
}
 
func (i Image) Bounds() image.Rectangle {
    // image.Rect를 사용해 이미지의 경계 영역을 반환합니다.
    return image.Rect(0, 0, i.Width, i.Height)
}
 
func (i Image) ColorModel() color.Model {
    // 픽셀 색상의 모델은 RGBA로 지정합니다.
    return color.RGBAModel
}
 
func (i Image) At(x, y int) color.Color {
    // 주어진 좌표 (x,y)에 해당하는 색상 값을 계산합니다.
    // 이전 생성기에서 사용한 v 값을 여기서도 유사하게 계산합니다.
    v := uint8((x + y) / 2)
    // 계산된 v 값을 RGBA 색상으로 반환합니다. RGB는 모두 v이고 Alpha는 항상 최대값입니다.
    return color.RGBA{v, v, 255, 255}
}
 
go

main 함수도 약간 수정해 보겠습니다:

func main() {
    m := Image{256, 256}  // 256x256 크기의 Image를 생성합니다.
    pic.ShowImage(m)      // pic 패키지의 ShowImage 함수를 통해 생성한 이미지를 봅니다.
}
 
go

자, 이제 코드를 실행해 보면 어떤 그림이 나올까요? 실행 결과로 나타나는 그라데이션 이미지를 감상해 보세요!

  • (x + y) / 2

lecture image

  • x * y

lecture image

  • x ^ y

lecture image

우리는 Go 언어에서 image.Image 인터페이스를 구현하여 자신만의 이미지 타입을 정의하고, 필요한 메서드들을 구현함으로써 그림 생성기를 만들어 보았습니다. image 패키지가 제공하는 여러 타입과 함수들을 활용하면 다채로운 이미지 처리 작업을 할 수 있겠죠?