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