[소재] 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.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (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.)