[소재] Excel 방안지 위에 좋아하는 이미지를 정사각형으로 페인트하는 도구를 Go로 만들어 보았다

16492 단어 5재료Excel 방안지

개요



일본 문화권에 있으면 어딘가에서 '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 형식을 로드할 수 있는 프로그램으로 마음껏 감상해 주세요.

코드



거친 흐름은 다음과 같습니다.
  • 원본 이미지 파일 가져 오기
  • 원본 이미지를 정사각형으로 잘라냅니다 (짧은 쪽의 길이로 중심에 따라).
  • 추가 크기 조정 (256x256)
  • 색상이 너무 많으면 힘들기 때문에 색상 수를 제한하기 위해 팔레트를 만듭니다
  • 변환 된 이미지를 기반으로 워크 시트의 셀을 채 웁니다
  • 통합 문서 파일 작성
  • 
    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"는 원하는 모양으로 편집할 수 있습니다.

    좋은 웹페이지 즐겨찾기