[소재] Excel 방안지 위에 좋아하는 이미지를 정사각형으로 페인트하는 도구를 Go로 만들어 보았다
개요
일본 문화권에 있으면 어딘가에서 'Excel 방안지'을 만날 수 있을 것입니다.
이 항목에서는 Excel 방안지에 좋아하는 그림을 페인트하여 바라 보는 도구를 만들어 보았습니다.
그림 : 컴퓨터에서 이미지 시스템 샘플에서 자주 사용되는 Lenna 페인트
TL; DR;
리포지토리는 여기 htps : // 기주 b. 코 m / hrkt / xls 파인 t입니다.
스스로 빌드하거나 릴리스 페이지에서 실행 형식 xlspaint.exe 및 템플릿의 template_256x256.xlsx 가져 오기 하고, 페인트 하고 싶은 이미지를 같은 디렉토리에 놓고, 아래와 같이 실행합니다.
xlspaint 方眼紙に描きたいファイル名
실행 예:
>xlspaint.exe sampledata\Lenna_512x512.png
format:png
512
2020/03/06 06:21:19 start redering
................................................................................................................................................................................................................................................................
2020/03/06 06:21:19 redering done.
성공하면 "원본 파일 이름"으로 확장하고 ".xlsx"가 붙은 파일이 완성됩니다.
Excel 형식을 로드할 수 있는 프로그램으로 마음껏 감상해 주세요.
코드
거친 흐름은 다음과 같습니다.
리포지토리는 여기 htps : // 기주 b. 코 m / hrkt / xls 파인 t입니다.
스스로 빌드하거나 릴리스 페이지에서 실행 형식 xlspaint.exe 및 템플릿의 template_256x256.xlsx 가져 오기 하고, 페인트 하고 싶은 이미지를 같은 디렉토리에 놓고, 아래와 같이 실행합니다.
xlspaint 方眼紙に描きたいファイル名
실행 예:
>xlspaint.exe sampledata\Lenna_512x512.png
format:png
512
2020/03/06 06:21:19 start redering
................................................................................................................................................................................................................................................................
2020/03/06 06:21:19 redering done.
성공하면 "원본 파일 이름"으로 확장하고 ".xlsx"가 붙은 파일이 완성됩니다.
Excel 형식을 로드할 수 있는 프로그램으로 마음껏 감상해 주세요.
코드
거친 흐름은 다음과 같습니다.
package main
import (
"flag"
"fmt"
"image"
"image/color"
"log"
"path/filepath"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
"os"
"github.com/nfnt/resize"
"github.com/oliamb/cutter"
"github.com/soniakeys/quant/median"
"github.com/tealeg/xlsx"
)
func min(a, b int) int {
if a < b {
return a
}
return b
}
func main() {
flag.Parse()
if 0 == len(flag.Args()) {
fmt.Println("Usage: xlspaint [imagefilename]")
os.Exit(1)
}
imgFilename := flag.Args()[0]
imgFile, _ := os.Open(imgFilename)
defer imgFile.Close()
srcImg, fmtName, err := image.Decode(imgFile)
if err != nil {
log.Fatal(err)
}
fmt.Println("format:" + fmtName)
length := min(srcImg.Bounds().Max.X, srcImg.Bounds().Max.Y)
fmt.Println(length)
// crop
croppedImg, err := cutter.Crop(srcImg, cutter.Config{
Width: length,
Height: length,
Mode: cutter.Centered,
})
//resize
resizedImg := resize.Resize(256, 0, croppedImg, resize.Lanczos3)
//make palette
p := median.Quantizer(256).Quantize(make(color.Palette, 0, 256), srcImg)
palletedImg := image.NewPaletted(srcImg.Bounds(), p)
for y := resizedImg.Bounds().Min.Y; y < resizedImg.Bounds().Max.Y; y++ {
for x := resizedImg.Bounds().Min.X; x < resizedImg.Bounds().Max.X; x++ {
palletedImg.Set(x, y, resizedImg.At(x, y))
}
}
excelFileName := "template_256x256.xlsx"
xlFile, err := xlsx.OpenFile(excelFileName)
if err != nil {
os.Exit(1)
}
sheet := xlFile.Sheets[0]
log.Println("start redering")
//read pixels from image and paint cells
for row := 0; row < 256; row++ {
fmt.Print(".")
for col := 0; col < 256; col++ {
style := xlsx.NewStyle()
r, g, b, _ := palletedImg.At(col, row).RGBA()
colorStr := fmt.Sprintf("FF%02x%02x%02x", r>>8, g>>8, b>>8)
style.Fill = *xlsx.NewFill("solid", colorStr, colorStr)
cell := sheet.Rows[row].Cells[col]
cell.SetStyle(style)
}
}
fmt.Println("")
log.Println("redering done.")
err = xlFile.Save(filepath.Base(imgFilename) + ".xlsx")
if err != nil {
fmt.Printf(err.Error())
}
os.Exit(0)
}
결론
문득 생각했기 때문에 하기 시작하면, (Golang는 그다지 잘 되지 않습니다만) 저것 이것 조사하면서 3시간 정도로 쓸 수 있었습니다.
보충
템플릿의 "template_256x256.xlsx"는 원하는 모양으로 편집할 수 있습니다.
Reference
이 문제에 관하여([소재] Excel 방안지 위에 좋아하는 이미지를 정사각형으로 페인트하는 도구를 Go로 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hrkt/items/2ddc6700bed57caa1d64
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
템플릿의 "template_256x256.xlsx"는 원하는 모양으로 편집할 수 있습니다.
Reference
이 문제에 관하여([소재] Excel 방안지 위에 좋아하는 이미지를 정사각형으로 페인트하는 도구를 Go로 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hrkt/items/2ddc6700bed57caa1d64텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)