4 คะแนน โดย GN⁺ 2024-06-08 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • lsix เป็นสคริปต์ Bash ที่แสดงภาพเป็นภาพขนาดย่อภายในเทอร์มินัลสำหรับไดเรกทอรีปัจจุบันหรือรายการไฟล์ที่ระบุ คล้าย ls และใช้ กราฟิก Sixel สำหรับการแสดงผล
  • ใช้ ImageMagick เพื่อจัดการรูปแบบภาพหลากหลายชนิด และหากระบุ GIF หรือไฟล์ที่บรรจุหลายภาพบนบรรทัดคำสั่ง จะคลี่ทุกเฟรมออกมาแสดงเป็น มอนทาจ
  • ตรวจจับว่ารองรับ Sixel ในเทอร์มินัลหรือไม่ รวมถึงสีตัวอักษร สีพื้นหลัง ความสามารถในการขยาย color register และความกว้างหน้าต่าง เพื่อปรับคุณภาพและการจัดวางภาพขนาดย่อ
  • การติดตั้งเพียงนำไฟล์ lsix ไปไว้ใน path และเตรียม ImageMagick ให้พร้อม ส่วนบน macOS สามารถติดตั้ง ImageMagick พร้อมกันได้ด้วย brew install lsix
  • XTerm ปิดโหมด Sixel ไว้โดยค่าเริ่มต้น และบางเทอร์มินัลก็ไม่รองรับ ดังนั้นก่อนใช้งานจริงควรตรวจสอบว่าเป็น เทอร์มินัลที่รองรับ Sixel

เครื่องมือแสดงรายการภาพในเทอร์มินัลที่ใช้งานเหมือน ls

  • lsix เป็นเครื่องมือที่ใกล้เคียงกับ ls สำหรับภาพ โดยแสดงภาพขนาดย่อแบบอินไลน์ในเทอร์มินัล
  • วิธีใช้งานพื้นฐานเรียบง่าย
    • พิมพ์ lsix อย่างเดียวเพื่อแสดงภาพในไดเรกทอรีทำงานปัจจุบัน
    • สามารถระบุชื่อไฟล์ในรูปแบบ lsix [ FILES ... ]
    • ใช้เชลล์ไวลด์การ์ดได้ เช่น lsix *jpg * png
  • ใช้กราฟิก Sixel สำหรับการแสดงผล

การจัดการฟอร์แมตและวิธีแสดงผลบนฐานของ ImageMagick

  • เนื่องจากใช้ ImageMagick จึงรองรับฟอร์แมตภาพได้หลากหลาย
  • ฟอร์แมตที่เรนเดอร์ช้าได้ เช่น PDF จะไม่ถูกแสดงหากไม่ได้ร้องขออย่างชัดเจน
    • หากต้องการบังคับแสดงฟอร์แมตใดโดยเฉพาะ ให้ระบุชื่อไฟล์ตรง ๆ หรือใช้ไวลด์การ์ดอย่าง *.pdf
  • หากระบุ GIF หรือไฟล์ที่มีหลายภาพในบรรทัดคำสั่ง จะคลี่ทุกเฟรมออกมาแสดงเป็น มอนทาจ
    • GIF อาจเก็บบางเฟรมโดยบันทึกเฉพาะพิกเซลที่ต่างจากเฟรมก่อนหน้า
  • กราฟิกที่ไม่ใช่บิตแมปก็อาจใช้งานได้
    • เช่น .svg, .eps, .pdf, .xcf

ความสามารถในการตรวจจับสภาพแวดล้อมของเทอร์มินัล

  • lsix ใช้ control sequence เพื่อตรวจจับว่าเทอร์มินัลสามารถแสดง กราฟิก Sixel แบบอินไลน์ได้หรือไม่
  • alpha channel ของ PNG และ SVG จะถูกจัดการให้สอดคล้องกับสีพื้นหลังของเทอร์มินัล
    • lsix จะพยายามอ่านสีตัวอักษรและสีพื้นหลังผ่าน terminal escape sequence
    • สีตัวอักษรถูกใช้เป็นสีเติมของข้อความ
  • หากตรวจพบเทอร์มินัลอย่าง xterm ที่เพิ่มจำนวน color register ได้ ก็จะขยายให้อัตโนมัติเพื่อยกระดับคุณภาพภาพ
  • ในเทอร์มินัลที่รองรับ dtterm WindowOps จะปรับจำนวนไทล์ต่อแถวให้พอดีกับความกว้างหน้าต่าง
  • เมื่อมีภาพจำนวนมากในไดเรกทอรี จะประมวลผลโดยไม่ต้องรอสร้างมอนทาจทั้งหมดให้เสร็จก่อน
    • หากมีภาพ มากกว่า 21 ภาพ จะเปลี่ยนไปแสดงทีละบรรทัด
  • หากชื่อไฟล์ยาวเกินไป จะตัดบรรทัดข้อความก่อนส่งให้ ImageMagick montage
    • หากใช้ montage โดยไม่มี lsix ชื่อไฟล์ยาวอาจซ้อนทับกันได้
  • ชื่อไฟล์ Unicode ใช้งานได้หากฟอนต์ที่ใช้มี glyph รองรับ

วิธีติดตั้งและการตั้งค่า

  • การติดตั้งทำได้โดยนำไฟล์ lsix ไปไว้ใน path เช่น /usr/local/bin แล้วเรียกใช้งาน
  • lsix เป็น สคริปต์ Bash shell
  • ซอฟต์แวร์ที่จำเป็นมีเพียง ImageMagick เท่านั้น
    • เช่น apt-get install imagemagick
  • ผู้ใช้ macOS สามารถใช้ brew install lsix ได้
    • หากจำเป็นจะติดตั้ง ImageMagick ให้ด้วย
  • การออกแบบปัจจุบันเรียบง่ายมาก
    • ไม่มีแฟลกบรรทัดคำสั่ง
    • ไม่มีไฟล์คอนฟิก
    • ไม่มีปุ่มปรับแต่ง
  • ค่าต่าง ๆ เช่น ความกว้างไทล์ ตระกูลฟอนต์ และขนาดพอยต์ สามารถเปลี่ยนได้ด้วยการแก้ตัวแปรด้านบนของไฟล์
    • สามารถดูรายการฟอนต์ที่ติดตั้งได้ด้วย convert -list font

ข้อกำหนดของเทอร์มินัลที่รองรับ Sixel

  • เทอร์มินัลต้องรองรับ กราฟิก Sixel
  • สามารถทดสอบเทอร์มินัลได้โดยส่งภาพเดี่ยวออกเป็น Sixel
convert foo.jpg -geometry 800x480 sixel:-
  • การพัฒนาใช้โหมด emulation ของ vt340 ใน xterm
  • XTerm ไม่ได้เปิดโหมด Sixel มาโดยค่าเริ่มต้น
    • ตอนรันสามารถใช้ xterm -ti vt340
    • หรือเพิ่ม xterm*decTerminalID : vt340 ลงใน .Xresources แล้วรัน xrdb -merge .Xresources
  • ดิสทริบิวชันบางตัว เช่น Fedora อาจคอมไพล์ xterm โดยไม่มีการรองรับ Sixel
    • ในกรณีนี้อาจลองใช้เทอร์มินัลทางเลือกอย่าง foot หรือ mlterm

เทอร์มินัลที่รองรับและไม่รองรับ

  • เทอร์มินัลที่ยืนยันแล้วหรือมีรายงานว่ารองรับ Sixel
    • XTerm, MLterm, foot, Wezterm, Contour, iTerm2 for Apple MacOS, Yaft ผ่านการทดสอบแล้ว
    • Konsole, yakuake, WSLtty for Microsoft Windows, MinTTY for Cygwin, VTE special compile, sixel-tmux, ttyd มีรายงานว่ารองรับ
  • เทอร์มินัลที่ไม่รองรับ Sixel
    • MacOS Terminal, kitty
    • เทอร์มินัลมาตรฐานที่อิง libvte
      • gnome-terminal
      • terminator
      • lxterm
    • Alacritty อาจใช้งานได้หากใช้ patch

บั๊กและข้อจำกัดที่ทราบ

  • โหมด reverse video ของ XTerm อย่าง xterm -rv ไม่เหมือนกับการระบุสีตัวอักษรและสีพื้นหลังแบบชัดเจน
    • แบบระบุชัดเจนยังมีวิธีตรวจจับได้ แต่ resource reverseVideo ตรวจจับไม่ได้ จึงอาจทำให้สีพื้นหลังผิดพลาด
  • ความกว้างหน้าจอของ XTerm ถูกจำกัดไว้ที่ 1000px ในปัจจุบัน
    • หาก xterm รองรับการประมวลผลภาพที่ใหญ่กว่า 1000x1000 ได้ในอนาคต ก็มีแผนจะยกเลิกข้อจำกัดนี้
    • การทดสอบล่าสุดอ้างอิงจาก XTerm(344)
  • ชื่อไฟล์ที่ขึ้นต้นด้วย @ จะถูกจัดการเป็นกรณีพิเศษโดย ImageMagick
    • ต้องใส่ไดเรกทอรีนำหน้า เช่น lsix ./@foo.png
    • นี่เป็นบั๊กของ ImageMagick ไม่ใช่ lsix
  • หากระบุชื่อไฟล์เป็นสตริงว่าง "" จะทำให้ ImageMagick ค้าง
    • ดูเหมือนจะเป็นบั๊กหรือพฤติกรรมที่ไม่ถูกต้องของ ImageMagick
  • การตัดบรรทัดชื่อไฟล์ยาวใช้งานได้ แต่ยังไม่ฉลาดนัก
    • ยังไม่ได้รองรับการตัดตามช่องว่าง ขีดกลาง ขีดล่าง หรือจุด
  • หากระบุไดเรกทอรีในบรรทัดคำสั่ง จะถูกจัดการเหมือนผู้ใช้ cd เข้าไปยังไดเรกทอรีนั้น
    • แม้การทำงานแบบ recursive จะไม่ยาก แต่ผู้พัฒนาไม่อยากเพิ่มแฟลกบรรทัดคำสั่งให้สคริปต์ที่ตั้งใจทำให้เรียบง่าย
  • การรัน lsix foo.avi อาจก่อให้เกิดปัญหาได้

มาตรฐาน Sixel และข้อจำกัดในการติดตั้งใช้งานจริง

  • ดูเหมือนว่ามาตรฐาน Sixel จะไม่มีวิธีสอบถามขนาดหน้าจอกราฟิก
  • หากอิงเอกสาร VT340 โปรแกรมควรรู้ความละเอียดของอุปกรณ์ปลายทางที่จะเรนเดอร์อยู่แล้ว
  • XTerm 344 เพิ่ม control sequence CSI ? Pi ; Pa ; Pv S เพื่อแก้ปัญหานี้
    • เทอร์มินัลบางตัวอย่าง mlterm ยังไม่ได้รองรับ
  • มีทางเลือกคือใช้ส่วนขยาย dtterm WindowOps เพื่ออ่านขนาดหน้าต่าง
    • แต่ขนาดกราฟิก Sixel กับขนาดหน้าต่างไม่จำเป็นต้องเท่ากันเสมอไป จึงไม่ใช่วิธีที่แม่นยำสมบูรณ์
    • เช่น xterm จำกัด geometry ของกราฟิกไว้ที่ 1000x1000 แม้หน้าต่างจะใหญ่กว่านั้นก็ตาม
  • หากทั้งสองวิธีล้มเหลว lsix จะสมมติว่าเป็นสภาพแวดล้อม VT340
    • ความละเอียดคือ 800x480
    • และถือว่าใส่ไทล์ได้เพียง 6 ชิ้นต่อแถว
  • มาตรฐาน Sixel ก็ไม่มีวิธีสอบถามจำนวน color register ที่ใช้ได้เช่นกัน
    • lsix ใช้ส่วนขยายของ xterm
    • หากเทอร์มินัลไม่ตอบสนอง จะสมมติว่าเป็น VT340 ดั้งเดิมและใช้เพียง 16 color register

เหตุผลที่ไม่ใช้ libsixel

  • libsixel เป็นโปรเจ็กต์ที่สร้างคำสั่งกราฟิก Sixel ที่ปรับแต่งประสิทธิภาพแล้ว
  • lsix ใช้ Bash และ ImageMagick แทน libsixel
    • เลือกเช่นนี้เพราะ Bash และ ImageMagick มีใช้อย่างแพร่หลาย จึงทำงานได้ง่ายแทบทุกที่
    • เพื่อให้สคริปต์ยังคงเรียบง่ายและผู้ใช้ปรับแก้หรือขยายต่อได้สะดวก
    • ImageMagick อ่านฟอร์แมตขาเข้าได้หลากหลายกว่า stb_image ที่ img2sixel ของ libsixel ใช้
      • เช่น xpm, svg, 16-bit png, ไฟล์ sixel
    • ImageMagick สามารถอ่านอินพุตและเขียนเอาต์พุต Sixel ได้โดยตรง
    • แม้ libsixel อาจเร็วกว่า แต่สำหรับการแสดงรายการไดเรกทอรีแบบง่าย ๆ ImageMagick ก็เร็วเพียงพอ

เอกสารอ้างอิง

1 ความคิดเห็น

 
GN⁺ 2024-06-08
ความคิดเห็นจาก Hacker News
  • ถ้าคุณเป็นเหมือนผมที่ ใช้เทอร์มินัลแทบไม่ได้ถ้าไม่มี tmux ตอนนี้บรานช์ Sixel ที่เคยเป็นเชิงทดลองก็ถูก merge เข้ามาในที่สุดเมื่อประมาณ 10 เดือนก่อน
    ตอนนี้สามารถ build tmux mainline ด้วย --enable-sixel แล้วใช้เครื่องมืออย่าง lsix ภายใน tmux ได้
    ถ้าอยากรู้ว่าเทอร์มินัลหรือ terminal multiplexer ตัวโปรดของคุณรองรับ Sixel หรือไม่ ให้ดูไซต์ "Are We Sixel Yet"
    https://github.com/tmux/tmux/commit/dfbc6b1888c110cf0ade66f2...
    https://www.arewesixelyet.com

    • ผมย้ายไปใช้ Zellij เมื่อไม่กี่ปีก่อน และใช้การรองรับ Sixel ได้ดีมาตั้งแต่ช่วงหนึ่งในปี 2022
      ถ้าอยากเปลี่ยน workflow ผมคิดว่าประสบการณ์เริ่มต้นดีกว่า tmux มาก
      ฟีเจอร์ที่เดิมทีต้องเพิ่มด้วยปลั๊กอินภายนอกและสคริปต์ config ซับซ้อน ๆ ถูกใส่มาให้ตั้งแต่แรก และความเสถียรรวมถึงประสิทธิภาพก็ดีกว่ามาก
      https://zellij.dev/
    • ผมยังไม่ค่อยเข้าใจว่า tmux เอาไว้ทำอะไร
      อธิบายได้ไหมว่าทำไมมันถึงกลายเป็น เครื่องมือจำเป็น ใน workflow และทำไมมันอาจจำเป็นกับงานของผมด้วย?
    • แต่ทำไมถึงต้องมีล่ะ? มีเหตุผลอะไรที่ต้องยัดกราฟิกพิกเซลเข้าไปใน กริดความละเอียดต่ำแบบข้อความ ด้วย? ใช้กราฟิกพิกเซลไปเลยไม่ได้หรือ?
    • ใช้ tmux มานานมากแล้ว และก่อนหน้านั้นก็ใช้ screen แต่ยังไม่ค่อยเข้าใจว่า Sixel จะสร้างความแตกต่างใหญ่ตรงไหน
      มันเป็นการเปลี่ยนแปลงระดับเอา window manager แบบ stack เข้ามาใน tmux เมื่อเทียบกับวิธี tile ปัจจุบันหรือเปล่า? หรือแค่ทำให้กราฟิกในเทอร์มินัลดีขึ้น? หรือผมเข้าใจผิดไปหมด?
      ถ้าเป็นแค่การทำให้กราฟิกดีขึ้น ก็ไม่ค่อยเข้าใจว่าทำไม tmux ต้องรองรับ และน่าจะสำคัญที่ฝั่ง terminal emulator อย่าง Gnome Terminal มากกว่า อาจต้องมีทั้งสองฝั่งก็ได้ แต่ผมคิดว่า tmux แค่ pass-through ให้ก็พอ
    • มีใครรู้ไหมว่าถ้าติดตั้ง tmux ด้วย brew แล้ว Sixel จะถูกเปิดใช้งาน หรือเปล่า?
  • ฟีเจอร์ที่ผมชอบที่สุดใน repository นี้คือไดเรกทอรี README.md.d
    เป็นไอเดียที่ค่อนข้างดี และคิดว่าไม่ต้องมี .md ก็ได้

    • ทีเด็ดจริง ๆ คือการ embed รูปเป็น Sixel ตรง ๆ ในไฟล์ README
      แบบนั้นแค่ cat README ก็อาจเห็นรูปแสดงออกมาได้เลย
  • ใช้ "\e[c" เพื่อ ตรวจจับการรองรับ Sixel โดยอัตโนมัติ
    https://github.com/hackerb9/lsix/blob/3a431793a747df3f934051...
    "\e[c" คือ "send device attributes"
    https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-F...

  • ไอเดียเจ๋ง แต่ใช้ไม่ได้บน PuTTY/KiTTY
    เมื่อรัน $ lsix จะเกิด error ว่าเทอร์มินัลไม่ได้รายงานว่ารองรับกราฟิก Sixel และบอกให้ใช้เทอร์มินัลที่รองรับ Sixel อย่าง xterm -ti vt340 หรือขอให้ผู้สร้างเทอร์มินัลเพิ่มการรองรับ
    สามารถทดสอบภาพเดี่ยวด้วย convert foo.jpg -geometry 800x480 sixel:- และถ้าเป็นเทอร์มินัลที่รองรับจริง ๆ ก็แนะนำให้รายงานบั๊กที่ http://github.com/hackerb9/lsix/issues
    รหัสคุณสมบัติของอุปกรณ์แสดงเป็น ^[[?6c
    น่าเสียดาย คงจะดูดีทีเดียว มี เทอร์มินัล Windows แบบโอเพนซอร์ส ที่รองรับ Sixel ไหม? ส่วนใหญ่เห็นแต่ฝั่ง Cygwin หรือ WSL ส่วนแบบสำหรับ Windows ล้วน ๆ ไม่ค่อยเห็น

    • ช่วงหลังเริ่มใช้ wezterm แล้วค่อนข้างชอบ
      เป็น cross-platform และรองรับกราฟิก Sixel
      https://github.com/wez/wezterm
    • Mintty เป็นเทอร์มินัล Windows ที่ยอดเยี่ยมและรองรับ Sixel
  • ในสายเดียวกันยังมี timg ด้วย: https://github.com/hzeller/timg

  • iTerm2 สำหรับ MacOS มีฟีเจอร์คล้ายกันในตัว และภาระฝั่งเซิร์ฟเวอร์ก็น้อยกว่า
    แทนที่จะให้เซิร์ฟเวอร์ใช้ไลบรารีรูปภาพจำนวนมากเรนเดอร์ภาพเป็น Sixel ก็เข้ารหัสภาพทั้งภาพเป็น base64 แล้วส่งไปยังไคลเอนต์ จากนั้นไคลเอนต์จะระบุรูปแบบภาพและเรนเดอร์ในเทอร์มินัลแบบ local
    https://iterm2.com/documentation-images.html

    • konsole ก็ implement protocol เดียวกันแล้ว
      ผมใช้สคริปต์ imgcat แบบไม่แก้ไขบน Linux ได้ตรง ๆ
      แน่นอนว่าเร็วกว่าการแปลงด้วย ImageMagick มาก แต่ตอนนี้ก็เพิ่ม lsix ไว้ในไดเรกทอรี bin แล้วเหมือนกัน
  • ควรระวังเมื่อรันในไดเรกทอรีที่ไม่น่าเชื่อถือ
    โดยเฉพาะสิ่งที่ parse รูปภาพอย่าง PDF อาจอันตรายได้เหมือนเครื่องมืออื่น ๆ และยิ่งต้องระวังเมื่อใช้ ImageMagick

    • การ parse รูปภาพที่ไม่น่าเชื่อถือเป็นปัญหาโดยเนื้อแท้เลยหรือ?
      ถ้าเปิดโฟลเดอร์ดาวน์โหลดที่ไม่น่าเชื่อถือด้วย Gnome Files แล้วมันแสดงรูปภาพข้างใน จึง parse รูปเหล่านั้นด้วย นั่นเป็นประเด็นความปลอดภัยที่ควรกังวลไหม?
      ผมคิดว่าสิ่งอย่าง JavaScript ใน PDF อาจเป็นปัญหาได้ แต่ไม่เคยคิดว่าแค่ preview ก็อันตรายด้วย
  • เทอร์มินัลที่ใช้ต้องรองรับ กราฟิก Sixel

    • ผมทำไลบรารีกราฟิกสำหรับเทอร์มินัลที่ไม่รองรับ Sixel ไว้
      https://github.com/dheera/python-termgraphics
      ถ้าปรับไลบรารีนี้ให้รองรับเป็น fallback path ได้ก็น่าสนใจ
    • xterm รองรับ Sixel ดังนั้นการตั้งค่าอย่าง TERM=xterm256-color ก็น่าจะ compatible ทั้งหมด… ใช่ไหม? แค่ก gnome-terminal แค่ก
    • mlterm ใช้งานได้
  • fzf ตั้งแต่เวอร์ชัน 0.44.0 มีการรองรับรูปภาพ Sixel แบบทดลองในหน้าต่าง preview
    ใช้บน Windows ไม่ได้
    https://github.com/junegunn/fzf/releases/tag/0.44.0
    fzf --preview='fzf-preview.sh {}'

    • อีกทางเลือกหนึ่งคือใช้ fzf --preview 'convert {} -geometry 800x480 sixel:-'
      วิธีนี้ก็ต้องติดตั้ง ImageMagick ด้วย