Golang으로 이미지에 텍스트 넣기

3454 단어 tutorialprogramminggo
경력 초기부터 Java를 주요 프로그래밍 언어로 사용했지만 최근 Golang을 사용하는 회사로 전환했고 언어에 대해 더 많이 배울 수 있도록 무언가를 만들기로 결정했습니다.

내가 요약하여 구축하는 서비스는 주어진 이미지에 일부 텍스트를 넣습니다. 주요 목적은 내가 Instagram 계정에 게시하는 게시물을 만드는 데 도움을 주는 것입니다.

예전에는 Photoshop으로 게시물을 만들었지만 간단한 이미지를 준비하는 데 너무 많은 시간이 걸렸고 흐름을 약간 단순화한 것을 발견했습니다Adobe Spark. Telegram Bot과 이제 메시지만 보내면 내 이미지를 게시할 수 있습니다. 예, 개선의 여지가 있지만 GoLang에 익숙해지고 내 Instagram용 이미지를 만드는 프로세스를 단순화하는 데 도움이 되는 것이 임무인 PoC일 뿐이라는 점을 명심하십시오.

TL;DR 코드를 보여주세요!




type Request struct {
    BgImgPath string
    FontPath  string
    FontSize  float64
    Text      string
}

func TextOnImg(request Request) (image.Image, error) {
    bgImage, err := gg.LoadImage(request.BgImgPath)
    if err != nil {
        return nil, err
    }
    imgWidth := bgImage.Bounds().Dx()
    imgHeight := bgImage.Bounds().Dy()

    dc := gg.NewContext(imgWidth, imgHeight)
    dc.DrawImage(bgImage, 0, 0)

    if err := dc.LoadFontFace(request.FontPath, request.FontSize); err != nil {
        return nil, err
    }

    x := float64(imgWidth / 2)
    y := float64((imgHeight / 2) - 80)
    maxWidth := float64(imgWidth) - 60.0
    dc.SetColor(color.White)
    dc.DrawStringWrapped(request.Text, x, y, 0.5, 0.5, maxWidth, 1.5, gg.AlignCenter)

    return dc.Image(), nil
}


그 코드 조각은 모든 마법을 만듭니다. Fogleman library의 도움으로 Go에서 이미지를 조작하는 것은 매우 쉽습니다. 이것이 무엇을 하는지 확인해 봅시다:

bgImage, err := gg.LoadImage(request.BgImgPath)


텍스트가 인쇄될 이미지를 로드합니다.

imgWidth := bgImage.Bounds().Dx()
imgHeight := bgImage.Bounds().Dy()


이미지의 WidthHeight를 기록합니다.

dc := gg.NewContext(imgWidth, imgHeight)
dc.DrawImage(bgImage, 0, 0)


작업을 시작할 캔버스(또는 컨텍스트)와 같은 것을 만듭니다.

dc.LoadFontFace(request.FontPath, request.FontSize)


인쇄할 메시지에 사용할 글꼴을 로드합니다.

x := float64(imgWidth / 2)
y := float64((imgHeight / 2) - 80)


X에 이미지의 중간을 기록하고 Y에서도 텍스트가 중간보다 약간 위에 있기를 원하기 때문에 80을 뺍니다.

maxWidth := float64(imgWidth) - 60.0


텍스트가 차지할 수 있는 최대 너비를 정의합니다. 이미지의 전체 너비에서 60을 빼는 것은 여백을 생성하는 것과 같으므로 텍스트가 이미지 가장자리에 닿지 않습니다.

dc.SetColor(color.White)


페인트/인쇄할 색상을 정의하고 있습니다.

dc.DrawStringWrapped(request.Text, x, y, 0.5, 0.5, maxWidth, 1.5, gg.AlignCenter)


중앙 정렬로 이미지 중간에 캔버스에 request.Text의 내용을 인쇄합니다.

결과는 다음과 같습니다.



이 모든 것이 어떻게 작동하는지에 대한 자세한 내용을 보려면 the DevsQuotesPrinter repository을 방문하십시오. GCP, Heroku에 배포하거나 로컬에서 사용해 볼 수 있는 지침이 있으므로 자유롭게 사용해 보십시오.

좋은 웹페이지 즐겨찾기