Go에서 ANSI 이스케이프 시퀀스로 착색된 텍스트를 이미지에 일으키는 명령을 만들었다

5892 단어 5commandcli

머리


  • Go에서 ANSI 이스케이프 시퀀스를 구문 분석하고 텍스트를 채색하여 이미지에 대한 명령을 만들었습니다.

    만든 경위


  • screenfetch 나 ccze 등으로 착색 된 텍스트를 이미지에 일으키고 싶었다
  • ImageMagick의 convert 명령은 ANSI 이스케이프 시퀀스에서 이미지를 착색하지 못했습니다.

    아티팩트



    GitHub - jiro4989/textimg

    사용법



    표준 입력에서 ANSI 이스케이프 시퀀스와 함께 텍스트를 전달하면 이미지가 내뿜습니다.
    단말기에 흘려도 어쩔 수 없기 때문에, 파일 출력이나, 파이프처가 존재하지 않을 때는 출력하지 않습니다.
    $ seq 0 255 | while read -r i; do
      echo -ne "\x1b[38;5;${i}m$(printf %03d $i)"
      if [ $(((i+1) % 16)) -eq 0 ]; then
        echo
      fi
    done | textimg -o 256_fg.png
    



    애니메이션 GIF도 생성할 수 있습니다.
    한 프레임에 몇 줄의 텍스트를 사용할 수도 있습니다.
    $ echo -e '\x1b[31mText\x1b[0m
    \x1b[32mText\x1b[0m
    \x1b[33mText\x1b[0m
    \x1b[34mText\x1b[0m
    \x1b[35mText\x1b[0m
    \x1b[36mText\x1b[0m
    \x1b[37mText\x1b[0m
    \x1b[41mText\x1b[0m
    \x1b[42mText\x1b[0m
    \x1b[43mText\x1b[0m
    \x1b[44mText\x1b[0m
    \x1b[45mText\x1b[0m
    \x1b[46mText\x1b[0m
    \x1b[47mText\x1b[0m' | textimg -a -o ansi_fb_anime_1line.gif
    



    이모티콘도 그릴 수 있습니다만, 환경 구축이 조금 번거롭다. 자세한 것은 README 보시면.
    $ echo Test👍 | textimg -o emoji.png
    



    설치



    이모티콘 등을 그릴 수 없어도 좋다면 아래만으로 충분합니다.
    go get -u github.com/jiro4989/textimg
    

    이모티콘을 그리려면 이모티콘 글꼴과 이모티콘 이미지를 준비해야 합니다.
    준비하는 방법에 대해서는 README에 기재하고 있으므로 그쪽을 참조해 주시면.

    그들 모두 포함한 Docker 이미지를 준비하고 있기 때문에 그것을 사용하는 것도 있습니다.
    docker pull jiro4989/textimg
    docker run -v $(pwd):/images -it jiro4989/textimg -h
    docker run -v $(pwd):/images -it jiro4989/textimg Testあいうえお😄 -o /images/a.png
    docker run -v $(pwd):/images -it jiro4989/textimg Testあいうえお😄 -s
    

    구현



    사용한 라이브러리


  • mattn/go-runewidth
  • spf13/cobra
  • x/image

  • 로직



    ANSI 이스케이프 시퀀스가 ​​포함된 텍스트를 다음과 같이 분해합니다.



    퍼스는 자력으로 바삭바삭하고 있습니다. 더럽지만 방치하고 있습니다.
    htps : // 기주 b. 이 m/지로 4989/에서 x치 mg/bぉb/마s r/에 sc 세 q/파 r 세. #L67

    분해된 요소는 각각 텍스트 또는 ANSI 이스케이프 시퀀스입니다.
    각각의 요소가 계속되는 한, 이하의 플로우로 처리합니다.



    이미지 버퍼에 오로지 텍스트를 그리는 것입니다만, ANSI 이스케이프 시퀀스의 경우는 색의 변수의 갱신만으로 좌표를 갱신하지 않고,
    텍스트를 할 때는 ANSI 이스케이프 시퀀스를 사용하여 이미지를 그리며 좌표를 업데이트하는 흐름을 계속 확장합니다.
    htps : // 기주 b. 이 m/지로 4989/에서 x치 mg/bぉb/마s r/이오마게/눈썹. #L58

    기능 추가하고 있는 안에 함수가 비대화해 더러워져 어떻게 된 것일까, 라고 생각하고 있지만, 원하는 기능을 구현해 버리는 일이 없기 때문에 방치하고 있습니다.

    색상 매핑



    어리석게 RGB 값과 매핑합니다.
    htps : // 기주 b. 코 m/지로 4989/에서 x치 mg/bぉb/마s r/에 sc 세 q/코 r. #L79

    요약



    다음 내용에 대해 썼습니다.
  • textimg 사용
  • textimg를 설치하는 방법
  • textimg 구현

  • 처음에는 ANSI 이스케이프 시퀀스를 이미지에 재현할 뿐이었지만,
    눈치채면 애니메이션 GIF를 생성할 수 있게 되어 있거나,
    어느새 다양하게 할 수 있게 되었습니다.
    Go에서 구현하는 재미 있습니다.

    이상입니다.

    좋은 웹페이지 즐겨찾기