Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JCConf - 隨你填貼圖的背後

JCConf - 隨你填貼圖的背後

隨你填貼圖的背後 @JCConf 2019 by Koji Lin 2019/10/04 https://jcconf.tw/2019/

LINE Developers Taiwan

October 04, 2019
Tweet

More Decks by LINE Developers Taiwan

Other Decks in Technology

Transcript

  1. About me • Koji Lin • LINE Fukuoka 株式会社 ◦

    開發 1 室 室長 ◦ 之前為 LINE 貼圖的後端工程師 • 社群活動 ◦ 前 TWJUG 主辦
  2. SVG • 充足的文件跟有標準 ◦ 可以預期 Browser 內 render 跟 server

    side 產生的圖片不會有太大差異 • 涵蓋我們隨你填貼圖的需求 ◦ 字型 ◦ 著色 ◦ 設定路徑
  3. SVG • Raster Images ◦ 固定大小,固定 pixels • Vector Graphics

    ◦ 用點、直線或者多邊形等基於數學方程的幾 何圖元表示圖像 • Rasterization ◦ 將 vector image 轉換成 raster image
  4. SVG Outlines • Fill 和 Stroke • 設定 fill 或

    stroke 順序在 SVG 2 才有 ◦ Chrome/Firefox 已經支援
  5. SVG viewBox • viewport ◦ 可視區域 • viewBox(min-x, min-y, widh,

    height) ◦ 要顯示的區域 • 透過 viewport & viewBox 可以讓我們組合多個 svg 跟提供正確的大小比例
  6. 技術選定 • 如何將匯出的 SVG 輸出成 PNG ? ◦ 讀取路徑跟字型,用 Java

    Graphics 產生 ◦ 直接將 SVG 轉換成 PNG ▪ Apache Batik ▪ Headless Browser ▪ 其他非 Java 的專案
  7. Apache Batik • Batik is a Java-based toolkit for applications

    or applets that want to use images in the Scalable Vector Graphics (SVG) format for various purposes, such as display, generation or manipulation • 算是已經開發非常久的專案,涵蓋我們所需要的 功能 ◦ 缺點是專案已經不是很活躍
  8. 字元,字形和字位 • Character ◦ Minimal unit of textual information •

    Glyph ◦ Visual representation of character(s) • Grapheme ◦ Anything that functions as an distinct unit within an orthography https://scripts.sil.org/IWS-Chapter02
  9. Glyph 位置錯誤 • Batik 使用了Font#createGlyphVector來取 得座標位置,但是該API本身並不支援泰文。必 須使用 1.4 後有的 layoutGlyphVector

    • Batik 預設 Glyph 的相對位置不會改變,所以快 取了 Glyph 的座標資訊 ◦ 泰文會因為順序而有不同高度
  10. 掉字/重複問題 • Batik 預設一個 Glyph 對應到一個 Character ◦ 一個 Character

    並不一定只對應到一個 Glyph ▪ 例如 ํา 在不同字型下 GlyphVector#getNumGlyphs 會回傳 1 或 2 ◦ 可以想像如果迴圈使用 Character 去計算, 但是要取得 Glyph 就會對不上
  11. 產生太多檔案 • 如果不使用系統安裝的字型,而在 SVG 中用路 徑指定,Batik 會在暫存資料夾產生快取 Font#createFont( int fontFormat,

    InputStream fontStream) • 解決方式就是在程式啟動時,透過 GraphicsEnvironment#registerFont 先安裝字型 後,SVG 內直接使用字型名稱