Go 언어로 여러 이미지를 세로로 연결
17342 단어 5ImageProcessing이미지 처리이미지
0. 소개
Go 언어를 사용하여 여러 장의 이미지 연결을 자동화하고 싶었기 때문에 Go 이미지 패키지를 사용하여 구현했습니다.
다른 Qiita 기사나 블로그 기사등도 찾았습니다만, 일본어로의 기사는 보이지 않았기 때문에, 간단한 내용입니다만 써 남기고 싶습니다.
1. 요구 사항
2. 알고리즘 요약
3. 구현
여러 이미지 로드
로드는 image package의 image.Decode() 과 image.DecodeConfig() 를 이용해 실시합니다.
// path: input image file path
func getImage(path string) (image.Image, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
return nil, err
}
return img, nil
}
func getImageConfig(path string) (image.Config, error) {
file, err := os.Open(path)
if err != nil {
return image.Config{}, err
}
defer file.Close()
config, _, err := image.DecodeConfig(file)
if err != nil {
return image.Config{}, err
}
return config, nil
}
이번에는 image.Config
중 Width 및 Height를 반복적으로 사용하기 위해 myImage
struct를 정의했습니다.
type myImage struct {
img image.Image
width int
height int
}
func getMyImage(path string) (myImage, error) {
img, err := getImage(path)
if err != nil {
return myImage{}, err
}
config, err := getImageConfig(path)
if err != nil {
return myImage{}, err
}
return myImage{img, config.Width, config.Height}, nil
}
실은 여기에 하나 빠져 포인트가 있고, os.Open() 한 file 에 대해 아래와 같이 image.Decode() 와 image.DecodeConfig() 하면 unknown format
와 에러가 됩니다.
file, _ := os.Open(path)
img, _, _ := image.Decode(file)
config, _, _ := image.DecodeConfig(file) // image: unknown format
참고: htp // 곧 03. 하테나 bぉg. 코m/엔트리/2016/06/23/105152
이번에 취급하는 화상은 고도 10장 정도이므로 2번 file 을 Open 하는 택을 취했습니다만, 요건에 따라서는 넥이 될지도 모릅니다.
출력 화상의 가로폭·세로폭의 산출
// path: input image file path
func getImage(path string) (image.Image, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
return nil, err
}
return img, nil
}
func getImageConfig(path string) (image.Config, error) {
file, err := os.Open(path)
if err != nil {
return image.Config{}, err
}
defer file.Close()
config, _, err := image.DecodeConfig(file)
if err != nil {
return image.Config{}, err
}
return config, nil
}
type myImage struct {
img image.Image
width int
height int
}
func getMyImage(path string) (myImage, error) {
img, err := getImage(path)
if err != nil {
return myImage{}, err
}
config, err := getImageConfig(path)
if err != nil {
return myImage{}, err
}
return myImage{img, config.Width, config.Height}, nil
}
file, _ := os.Open(path)
img, _, _ := image.Decode(file)
config, _, _ := image.DecodeConfig(file) // image: unknown format
func getMaxWidth(imgs []myImage) int {
var res int
for _, img := range imgs {
if res < img.width {
res = img.width
}
}
return res
}
func getSumHeight(imgs []myImage) int {
var res int
for _, img := range imgs {
res += img.height
}
return res
}
위의 가로 및 세로 너비를 기반으로 빈 출력 이미지 생성
image.NewRGBA
를 사용하여 빈 출력 이미지를 생성합니다.// imgs: []myImage
outImgWidth := getMaxWidth(imgs)
outImgHeight := getSumHeight(imgs)
outImg := image.NewRGBA(image.Rect(0, 0, outImgWidth, outImgHeight))
이미지를 한 장씩 출력 이미지에 씁니다.
image/draw
package draw.Draw()
를 사용하여 이전 출력 이미지에 읽은 이미지를 씁니다.pos := 0
for _, img := range imgs {
rect := image.Rect(0, pos, img.width, pos+img.height)
draw.Draw(outImg, rect, img.img, image.Point{0, 0}, draw.Over)
pos += img.height
}
각 설명
image.Point{0, img.height/2}
이상의 연결된 이미지를 생성하는 구현을 정리하면 다음과 같이 됩니다.
func createConcatImage(imgs []myImage) *image.RGBA {
outImgWidth := getMaxWidth(imgs)
outImgHeight := getSumHeight(imgs)
outImg := image.NewRGBA(image.Rect(0, 0, outImgWidth, outImgHeight))
pos := 0
for _, img := range imgs {
rect := image.Rect(0, pos, img.width, pos+img.height)
draw.Draw(outImg, rect, img.img, image.Point{0, 0}, draw.Over)
pos += img.height
}
return outImg
}
4. 결론
이상이 복수장 화상을 연결하는 실장이 됩니다.
요구 사항의 사정상 Github 등에서 공유하기 힘들었기 때문에, 이미지 연결의 구현 부분을 Go Playground 로 공유합니다. (그러나 이미지를 로드해야 하므로 그대로 실행할 수 없습니다.)
낭문 · 장문에 사귀어 주셔서 감사합니다.
조금이라도 도움이되면 다행입니다.
Reference
이 문제에 관하여(Go 언어로 여러 이미지를 세로로 연결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tarotaro0/items/7d139b09a0a1ac01d42f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Go 언어로 여러 이미지를 세로로 연결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tarotaro0/items/7d139b09a0a1ac01d42f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)