

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FontForge &#8211; MaxCodeReview</title>
	<atom:link href="https://codereview.max-everyday.com/tag/fontforge/feed/" rel="self" type="application/rss+xml" />
	<link>https://codereview.max-everyday.com</link>
	<description>分享Max收集的小程式</description>
	<lastBuildDate>Sat, 17 Jan 2026 14:46:16 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://codereview.max-everyday.com/wp-content/uploads/2020/07/cropped-logo1_x512-32x32.jpg</url>
	<title>FontForge &#8211; MaxCodeReview</title>
	<link>https://codereview.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>移除字型檔中指定集合</title>
		<link>https://codereview.max-everyday.com/clear_glyph/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Sun, 06 Apr 2025 16:47:15 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1945</guid>

					<description><![CDATA[Max腳本檔案下載：https://gith [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/clear_glyph.py">https://github.com/max32002/MaxFontScripts/blob/master/clear_glyph.py</a></p>



<p><strong>使用方法:</strong></p>



<pre class="wp-block-code"><code>fontforge clear_glyph.py --input INPUT --output new-font.ttf --string STRING</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><code>--input</code> 輸入的來源字體專案目錄。</li>



<li><code>--output</code> 要處理的字體專案目錄或字型檔。</li>



<li><code>--string</code> 要取出的字串。預設值是空字串.</li>



<li><code>--file</code> 使用文字檔內的子串.</li>



<li><code>--skip_alt</code> 遇到有alt (lookup) 的字, 不刪除. 以避免錯誤: Lookup subtable contains unused glyph uni???? making the whole subtable invalid</li>
</ul>



<p><strong>執行結果：</strong></p>



<figure class="wp-block-image"><img fetchpriority="high" decoding="async" width="1122" height="316" src="https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-25_13-14_5n.jpg?v=1737782096" alt="" class="wp-image-1728" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-25_13-14_5n.jpg?v=1737782096 1122w, https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-25_13-14_5n-1000x282.jpg?v=1737782096 1000w, https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-25_13-14_5n-230x65.jpg?v=1737782096 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-25_13-14_5n-350x99.jpg?v=1737782096 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-25_13-14_5n-480x135.jpg?v=1737782096 480w" sizes="(max-width: 1122px) 100vw, 1122px" /></figure>



<p>說明：</p>



<ul class="wp-block-list">
<li>開啟 alpha-1.ttf</li>



<li>刪除字元 g</li>



<li>另存為 alpha-2.ttf</li>



<li>來源字型字元數: 8</li>



<li>被清除掉的字元數: 1, (代表: 另存完的字元數: 7)</li>



<li>這個範例可以直接對2個字型檔操作, 針對大型的字型檔, 效率非常顯著的提升很多.</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2個ttf字型檔的包含文字相減,另存為新字型檔</title>
		<link>https://codereview.max-everyday.com/font_delete_font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Sun, 06 Apr 2025 16:42:47 +0000</pubDate>
				<category><![CDATA[字體]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1942</guid>

					<description><![CDATA[直接存取 .ttf 字型檔, 做2個字型的相 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>直接存取 .ttf 字型檔, 做2個字型的相減處理.</p>



<p>重要：刪除檔案前，請先一定要做要備份，因為會救不回來！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/font_delete_font.py">https://github.com/max32002/MaxFontScripts/blob/master/font_delete_font.py</a></p>



<p><strong>使用方法:</strong></p>



<pre class="wp-block-code"><code>fontforge font_delete_font.py --input input_font --remove selecte_font --output new-font.ttf</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><code>--input</code> 輸入的來源字體專案目錄。</li>



<li><code>--remove</code> 要移除文字清單的字體專案目錄。</li>



<li><code>--output</code> 要處理的字體專案目錄或字型檔。</li>
</ul>



<p><strong>執行結果：</strong></p>



<figure class="wp-block-image"><img decoding="async" width="1205" height="358" src="https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-27_13-19_5o.jpg?v=1737955190" alt="" class="wp-image-1747" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-27_13-19_5o.jpg?v=1737955190 1205w, https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-27_13-19_5o-1000x297.jpg?v=1737955190 1000w, https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-27_13-19_5o-230x68.jpg?v=1737955190 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-27_13-19_5o-350x104.jpg?v=1737955190 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/11/2025-01-27_13-19_5o-480x143.jpg?v=1737955190 480w" sizes="(max-width: 1205px) 100vw, 1205px" /></figure>



<p>說明：</p>



<ul class="wp-block-list">
<li>開啟 1.sfdir, 當作來源字型.</li>



<li>開啟 2.sfdir, 列出所有的文字清單.</li>



<li>另存為 3.sfdir</li>



<li>被清除掉的字元數: 2, 在個案之中, 這2個字其實只有一個檔案, 使用了 alt 對映.</li>



<li>被清除掉的字元數: 1, 在個案之中, 來源字型 1.sfdir 只有2個字, 2.sfdir 是1個字, 但有使用 alt 對映.</li>



<li>這個範例可以直接對2個字型檔 .ttf 操作, 針對大型的字型檔, 效率非常顯著的提升很多.</li>



<li>也可以使用這個 script 來解決刪除不常用字, 讓字型減肥的效果, 參考:<br>從文字檔移除特定文字集合<br><a href="https://codereview.max-everyday.com/remove-selected-char/">https://codereview.max-everyday.com/remove-selected-char/</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>簡化字型線條</title>
		<link>https://codereview.max-everyday.com/simplify/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 24 Jan 2025 04:59:34 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1697</guid>

					<description><![CDATA[簡化字型線條是為了符合瀏覽器的需要, 瀏覽器 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>簡化字型線條是為了符合瀏覽器的需要, 瀏覽器支援的 .ttf 或 web font 格式必需小於等於30MB, 簡化線條可以讓檔案變小.</p>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/simplify.py">https://github.com/max32002/MaxFontScripts/blob/master/simplify.py</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>fontforge simplify.py --input your-font --output new-font</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li>input: fontforge 專案目錄, 或是字型檔, 應該大家都會用字型檔, 比較有效率.</li>



<li>output: 要輸出的字型檔或專案目錄</li>



<li>error_bound: Tries to remove excess points in the glyph if doing so will not perturb the curve by more than error-bound</li>
</ul>



<p><strong>說明:</strong></p>



<ul class="wp-block-list">
<li>在操作大型的字型檔時, 往往需要很高的記憶體, 一但記憶體不足, fontforge 就會crash. Window 平台上新的版本的 fontforge 是 32 位元版本, 因為 macOS / Linux 長期都是 64位元, 反而在 macOS / Linux 可以順利地直接處理大型的字型檔.</li>



<li>實際測試在 Windows 32位元版本, 當程式內部使用的記憶體超過 2.1GB 的 RAM, fontforge 程式就會閃退 crash, 針對會需要處理大型的字型檔, 請改安裝 64位元版本, fontforge x64下載用傳送門: <a href="https://sourceforge.net/projects/fontforgebuilds/files/x86_64/Portable/">https://sourceforge.net/projects/fontforgebuilds/files/x86_64/Portable/</a></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">簡化 svg 檔</h2>



<ul class="wp-block-list">
<li>Scour<br><a href="https://github.com/scour-project/scour">https://github.com/scour-project/scour</a></li>



<li>picosvg<br><a href="https://github.com/googlefonts/picosvg">https://github.com/googlefonts/picosvg</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>分割字型為多個檔案</title>
		<link>https://codereview.max-everyday.com/split_font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 24 Jan 2025 04:17:09 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1690</guid>

					<description><![CDATA[通常字型分割是為了符合瀏覽器的需要, 瀏覽器 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>通常字型分割是為了符合瀏覽器的需要, 瀏覽器支援的 .ttf 或 web font 格式必需小於等於30MB.</p>



<p>大型的字型檔在 fontforge 是很脆弱的, 動不動就會讓 fontforge crash, 與其重覆操作很多次, 不如切割內容, 最後處理完成, 再進行合併.</p>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/split_font.py">https://github.com/max32002/MaxFontScripts/blob/master/split_font.py</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>fontforge split_font.py --input your-font</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li>input: fontforge 專案目錄, 或是字型檔, 應該大家都會用字型檔, 比較有效率.</li>



<li>max_glyphs: 每個檔案的 glyphs 上限, 預設 15000, 實際測試改用 10000, 效果顯著.</li>



<li>font_ext: 預設輸出 .ttf, 想轉成 webfont 可以使用 .woff2</li>
</ul>



<p><strong>說明:</strong></p>



<ul class="wp-block-list">
<li>由於需要使用到 font forge library, 所以要透過 font forge 執行這一個 python script.</li>



<li>這個切割方式, 還有很多問題, 例如會造成:
<ul class="wp-block-list">
<li>lookups 失敗</li>



<li>No glyph with unicode U+0???? in font</li>



<li>GID out of range (65535) in format 14 &#8216;cmap&#8217; subtable</li>
</ul>
</li>



<li>切成多個小檔案的優點就是, 比較不會遇到記憶體相關的議題, 例如:
<ul class="wp-block-list">
<li>internal buffer error : Memory allocation failed : growing buffer</li>



<li>I/O error : Memory allocation failed : growing input buffer</li>



<li>parser error : Memory allocation failed</li>
</ul>
</li>



<li>在操作大型的字型檔時, 往往需要很高的記憶體, 一但記憶體不足, fontforge 就會crash. Window 平台上新的版本的 fontforge 是 32 位元版本, 因為 macOS / Linux 長期都是 64位元, 反而在 macOS / Linux 可以順利地直接處理大型的字型檔.</li>



<li>實際測試在 Windows 32位元版本, 當程式內部使用的記憶體超過 2.1GB 的 RAM, fontforge 程式就會閃退 crash, 針對會需要處理大型的字型檔, 請改安裝 64位元版本, fontforge x64下載用傳送門:<br><a href="https://sourceforge.net/projects/fontforgebuilds/files/x86_64/Portable/">https://sourceforge.net/projects/fontforgebuilds/files/x86_64/Portable/</a></li>
</ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>移除字型檔的 lookups</title>
		<link>https://codereview.max-everyday.com/remove_lookups/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 24 Jan 2025 03:17:51 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1682</guid>

					<description><![CDATA[lookups 應該是異體字的對映, 實際測 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>lookups 應該是異體字的對映, 實際測試這個script, 輸入前有 58 lookups, 另存檔案後有 57 lookups, 移掉了 1個.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1514" height="584" src="https://codereview.max-everyday.com/wp-content/uploads/2025/01/2025-01-24_11-16_5k.jpg?v=1737688613" alt="" class="wp-image-1685" srcset="https://codereview.max-everyday.com/wp-content/uploads/2025/01/2025-01-24_11-16_5k.jpg?v=1737688613 1514w, https://codereview.max-everyday.com/wp-content/uploads/2025/01/2025-01-24_11-16_5k-1000x386.jpg?v=1737688613 1000w, https://codereview.max-everyday.com/wp-content/uploads/2025/01/2025-01-24_11-16_5k-230x89.jpg?v=1737688613 230w, https://codereview.max-everyday.com/wp-content/uploads/2025/01/2025-01-24_11-16_5k-350x135.jpg?v=1737688613 350w, https://codereview.max-everyday.com/wp-content/uploads/2025/01/2025-01-24_11-16_5k-480x185.jpg?v=1737688613 480w" sizes="(max-width: 1514px) 100vw, 1514px" /></figure>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/remove_lookups.py">https://github.com/max32002/MaxFontScripts/blob/master/remove_lookups.py</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>fontforge remove_lookups.py your-font </code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li>輸入參數只有一個, 就是 fontforge 專案目錄, 或是字型檔, 應該大家都會用字型檔, 比較有效率.</li>



<li>輸出檔案, 固定是 output.ttf 與 output2.ttf</li>
</ul>



<p>說明, 由於需要使用到 font forge library, 所以要透過 font forge 執行這一個 python script.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>從字體專案裡刪除特定文字</title>
		<link>https://codereview.max-everyday.com/delete-selected-glyph/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Tue, 09 Nov 2021 19:19:24 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1546</guid>

					<description><![CDATA[為什麼要學這個？ 與使用「人工」手動去處理相 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>與使用「人工」手動去處理相比，用程式去刪除特定文字有效率。</p>



<p>這個程式與另外2個程式，有一點點相似，如果是使用 copy_lost_out.py 或使用 copy_selected_out.py 是無法處理「複雜的」字型檔，如果使用了 .vert 檔案 或是設定了 kerning 之類的設定值，暫時還沒有寫程式去使判斷。</p>



<p>延伸的問題是，要避免直接複製.glyph 到 font forage 專案的目錄裡，遇到複雜的字型檔時，會造成 kerning 之類的設定值錯亂，因為共用的外部檔案的編號會相同，所以要合併複雜的字型時，請使用 Font Forge 的 Merge Font&#8230; 來合併。</p>



<p>重要：刪除檔案前，請先一定要做要備份，因為會救不回來！有提供參數 &#8211;check_only , 就不會刪除任何檔案.</p>



<p>下面提供3種解法來處理, 本篇文章是解法1:</p>



<ul class="wp-block-list">
<li><a href="#delete_selected_glyph">解法1: 透過 python 處理 fontforge 匯出的專案目錄.</a></li>
</ul>



<p>建議改用下面2篇文章的解法, 效率更高。</p>



<ul class="wp-block-list">
<li>解法2: 透過 fontforge 開啟字型檔, 從字串或文字檔移除目標<br><a href="https://codereview.max-everyday.com/clear_glyph/">https://codereview.max-everyday.com/clear_glyph/</a></li>



<li>解法3: 透過 fontforge 開啟2個字型檔, 字型檔移除字型檔包含項目<br><a href="https://codereview.max-everyday.com/font_delete_font/">https://codereview.max-everyday.com/font_delete_font/</a></li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge，把要處理的字體先存成.sfdir 的資料夾格式。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading" id="delete_selected_glyph">解法1: 透過 python 處理 fontforge 匯出的專案目錄.</h2>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/delete_selected_glyph.py" target="_blank" rel="noreferrer noopener">https://github.com/max32002/MaxFontScripts/blob/master/delete_selected_glyph.py</a></p>



<p><strong>使用方法:</strong></p>



<pre class="wp-block-code"><code>delete_selected_glyph.py --input INPUT --string STRING</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><code>--input</code> 要處理的字體專案目錄。</li>



<li><code>--string</code> 要取出的字串。</li>



<li><code>--check_only</code> 不實際刪除檔案。</li>



<li><code>--check_alt</code> 檢查 alt 欄位。</li>
</ul>



<p><strong>操作範例：</strong></p>



<pre class="wp-block-code"><code><meta charset="utf-8">delete_selected_glyph.py --input source.sfdir --string 每一天</code></pre>



<p>使用範例：從 source.sfdir 刪除 「每一天」3個字的 .glyph 檔案。</p>



<p>說明: 上面的範例, 只能針對 .sfdir 的資料夾做處理.</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<p>透過指令「字體」與「FontForge專案」互轉<br><a href="https://codereview.max-everyday.com/font-to-fontforge/">https://codereview.max-everyday.com/font-to-fontforge/</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>合併字型較安全的方法</title>
		<link>https://codereview.max-everyday.com/a-safer-way-to-merge-fonts/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Wed, 15 Sep 2021 19:10:41 +0000</pubDate>
				<category><![CDATA[字體]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1531</guid>

					<description><![CDATA[如果你的字體檔案，都沒有使用到「進階」的功能 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>如果你的字體檔案，都沒有使用到「進階」的功能，那直接把 FontForge 專案檔案裡的 .glyph 檔案直接複製出來就可以合併2個字體檔，但是如果有遇到較複雜的字體，請還是使用 FontForge 提供的 Merge Fonts&#8230; 功能，在 Element 目錄裡。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="366" height="553" src="https://codereview.max-everyday.com/wp-content/uploads/2021/09/Screen-Shot-2021-09-16-at-2.57.34-AM.jpg" alt="" class="wp-image-1533" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/09/Screen-Shot-2021-09-16-at-2.57.34-AM.jpg?v=1631732833 366w, https://codereview.max-everyday.com/wp-content/uploads/2021/09/Screen-Shot-2021-09-16-at-2.57.34-AM-230x348.jpg?v=1631732833 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/09/Screen-Shot-2021-09-16-at-2.57.34-AM-350x529.jpg?v=1631732833 350w" sizes="(max-width: 366px) 100vw, 366px" /></figure>



<p>什麼情況下，建議使用呢？最好都是使用這種方式合併，比較不會出問題。</p>



<p><meta charset="utf-8">什麼情況下，會出問題呢？例如，有某一個 .glyph 使用了 Refer 的功能：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="660" src="https://codereview.max-everyday.com/wp-content/uploads/2021/09/Screen-Shot-2021-09-16-at-3.01.31-AM-1024x660.png?v=1631732962" alt="" class="wp-image-1534"/></figure>



<p>直接移動 .glyph 檔案的結果是，字體檔案內容會錯亂。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>再更替代解法:</p>



<p>透過指令合併2個字體檔案<br><a href="https://codereview.max-everyday.com/merge-font/">https://codereview.max-everyday.com/merge-font/</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>更替代的解法, 先把  .ttf 匯出為 .svg, 再匯入 .svg 到 .ttf.</p>



<ul class="wp-block-list">
<li>向量檔匯入字體檔<br><a href="https://codereview.max-everyday.com/import-svg-to-font/">https://codereview.max-everyday.com/import-svg-to-font/</a></li>



<li>字體檔匯出為SVG向量檔格式<br><a href="https://codereview.max-everyday.com/export_ttf_to_svg/">https://codereview.max-everyday.com/export_ttf_to_svg/</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>使用繪圖軟體修改字型檔</title>
		<link>https://codereview.max-everyday.com/modify-font-by-photo-editor/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 06 Aug 2021 20:44:57 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[image]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1516</guid>

					<description><![CDATA[字體工具的編輯界面，如果不太熟悉，想透過繪圖 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="793" src="https://codereview.max-everyday.com/wp-content/uploads/2021/08/modify-font-by-photo-editor-cover-1024x793.jpg" alt="" class="wp-image-1519"/></figure>



<p>字體工具的編輯界面，如果不太熟悉，想透過繪圖軟體來修改字型，你可以這麼做：</p>



<ul class="wp-block-list"><li>Step 1: 在字體工具，匯出該文字，為 .bmp格式。</li><li>Step 2: 使用繪圖軟體編輯。</li><li>Step 3: 轉換 .bmp 為 .svg 格式。（使用potrace外部指令）</li><li>Step 4: 在字體工具，匯出.svg 格式。</li></ul>



<p>只要這4個步驟就完成了。</p>



<p>如果你也和我一樣缺乏美感，對筆劃們的位置與長度無法拿捏，請參考看看，如何讓AI輔助我們造字：</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>AI造字經驗分享<br><a href="https://max-everyday.com/2021/07/zi2zi-ai-font/">https://max-everyday.com/2021/07/zi2zi-ai-font/</a></p></blockquote>



<hr class="wp-block-separator"/>



<p>大波浪圓體補字：旎旖曆步歲歷溼煞 <br><a href="https://youtu.be/KK9PA9Gp4tg">https://youtu.be/KK9PA9Gp4tg</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="大波浪圓體補字：旎旖曆步歲歷溼煞" width="1170" height="658" src="https://www.youtube.com/embed/KK9PA9Gp4tg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>



<p>大波浪圓體補字：妳<br><a href="https://youtu.be/rzNh6eOfYts">https://youtu.be/rzNh6eOfYts</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="大波浪圓體補字：妳" width="1170" height="658" src="https://www.youtube.com/embed/rzNh6eOfYts?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>



<hr class="wp-block-separator"/>



<p>大波浪圓體補字：口部<br><a href="https://youtu.be/eMLZxgJWzrk">https://youtu.be/eMLZxgJWzrk</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="大波浪圓體補字：口部" width="1170" height="658" src="https://www.youtube.com/embed/eMLZxgJWzrk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>



<hr class="wp-block-separator"/>



<p>大波浪圓體補字：摠聰總傯<br><a href="https://youtu.be/gTbc1A4TQUQ">https://youtu.be/gTbc1A4TQUQ</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="大波浪圓體補字：摠聰總傯" width="1170" height="878" src="https://www.youtube.com/embed/gTbc1A4TQUQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">相關文章</h2>



<ul class="wp-block-list"><li>以描摹方式建立或更新字型<br><a href="https://codereview.max-everyday.com/create-new-font-by-draw/">https://codereview.max-everyday.com/create-new-font-by-draw/</a></li><li>向量檔匯入字體檔<br><a href="https://codereview.max-everyday.com/import-svg-to-font/">https://codereview.max-everyday.com/import-svg-to-font/</a></li><li>使用貝茲曲線與向量圖層<br><a href="https://krita.max-everyday.com/bezier-curve-vector-layer/">https://krita.max-everyday.com/bezier-curve-vector-layer/</a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>實體手寫圖檔轉成字型檔</title>
		<link>https://codereview.max-everyday.com/handwriting-to-font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 30 Jul 2021 22:01:51 +0000</pubDate>
				<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1480</guid>

					<description><![CDATA[實體手寫的圖形檔案轉成字型檔案，這個功能已經 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>實體手寫的圖形檔案轉成字型檔案，這個功能已經有網站提供這樣子的服務，例如守寫字(<a href="https://www.writes.com.tw/">https://www.writes.com.tw/</a>)，如果自己想做出類似的功能，要怎麼完成呢？透過下面的6個步驟就可以完成了：</p>



<ul class="wp-block-list"><li>Step 1: 先取得文字輪廓電子檔</li><li>Step 2: 圖片轉灰階</li><li>Step 3: 調整對比（二極化）</li><li>Step 4: 使用模糊讓線條平滑（建議略過）</li><li>Step 5: 使用畫畫工具填入白色與黑色</li><li>Step 6: 匯入圖片到字型檔</li></ul>



<p>可以參考Max提供的相關腳本，應該也可以做出「類似」守寫字網站的效果，在沒有人工處理情況下，自動轉換取得的文字圖片為字體檔。為什麼是類似？因為在圖像處理時，針對線條平滑的處理，超乎想像的難&#8230;，用人工在FontForge裡調整會簡單些。</p>



<hr class="wp-block-separator"/>



<p>大致上的做法與這篇教學類似：<br>以描摹方式建立或更新字型<br><a href="https://codereview.max-everyday.com/create-new-font-by-draw/">https://codereview.max-everyday.com/create-new-font-by-draw/</a></p>



<p>差別在輸入的文字的輪廓資料是從實際可以觸摸的紙與筆來，所以會多一個類比轉數位的動作，如果家裡有掃描器的話，取得的資料比較不會有失真（或變形）的問題，如果是自己用手機相機拍攝的電子檔，會因為距離遠近，造成線條些許的誤差。</p>



<p>類比的輪廓要轉數位，一定會遇到消除鋸齒的平滑處理，如果想透過程式自動完成，可以參考看看這一篇：<br>opencv python 影像模糊與反鋸齒處理<br><a href="https://stackoverflow.max-everyday.com/2021/07/opencv-python-image-blur-anti-aliasing/">https://stackoverflow.max-everyday.com/2021/07/opencv-python-image-blur-anti-aliasing/</a></p>



<p>這次我們是要使用手工的處理，可以先參考看看這一篇：<br>小圖放大有鋸齒馬賽克，三步快速變清晰<br><a href="https://krita.max-everyday.com/3-steps-anti-aliasing/">https://krita.max-everyday.com/3-steps-anti-aliasing/</a></p>



<hr class="wp-block-separator"/>



<p>有一天，看到清松手寫的作者，貼了一張照片在社團，分享他的處理流程：<br><a href="https://www.facebook.com/groups/549661292148791/posts/1257526298028950/">https://www.facebook.com/groups/549661292148791/posts/1257526298028950/</a></p>



<p>類比世界的手寫的經掃描器後變成電子檔的原圖：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="588" height="588" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n.jpg" alt="" class="wp-image-1482" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n.jpg?v=1627673980 588w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-300x300.jpg?v=1627673980 300w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-150x150.jpg?v=1627673980 150w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-230x230.jpg?v=1627673980 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-350x350.jpg?v=1627673980 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-480x480.jpg?v=1627673980 480w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226307376_4517345708289700_2500665025811289574_n-50x50.jpg?v=1627673980 50w" sizes="(max-width: 588px) 100vw, 588px" /></figure>



<p>作者透過守寫字網站的處理，再手工地調整的成品：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="673" height="727" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n.jpg" alt="" class="wp-image-1483" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n.jpg?v=1627674122 673w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n-230x248.jpg?v=1627674122 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n-350x378.jpg?v=1627674122 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/226507788_4517345698289701_2778555398747304331_n-480x519.jpg?v=1627674122 480w" sizes="(max-width: 673px) 100vw, 673px" /></figure>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">如果不透過守寫字，要怎麼來完成？</h2>



<h3 class="wp-block-heading">Step 1: 先取得文字輪廓電子檔</h3>



<p>這個可以使用手機的相機，或掃描器，我們直接使用原作者提供的電子檔，再使用繪圖軟體去除外框。</p>



<p> 附註：建議圖片的大小與字體檔裡字體的 Em Size 一致，常見的值是 1024 或  1000.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="771" height="847" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM.jpg" alt="" class="wp-image-1484" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM.jpg?v=1627674455 771w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM-230x253.jpg?v=1627674455 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM-350x385.jpg?v=1627674455 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.28.52-AM-480x527.jpg?v=1627674455 480w" sizes="(max-width: 771px) 100vw, 771px" /></figure>



<h3 class="wp-block-heading">Step 2: 圖片轉灰階</h3>



<p>因為字體檔是只有黑與白，彩色是用不到的，處理前先轉灰階，如果你是使用 krita, 點上方menu 裡的 image &#8211; Convert Image Color Space&#8230; 就可以把 RGB/Alpha 轉灰階 Grayscale/Alpha.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="763" height="844" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM.jpg" alt="" class="wp-image-1485" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM.jpg?v=1627674685 763w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM-230x254.jpg?v=1627674685 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM-350x387.jpg?v=1627674685 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.29.16-AM-480x531.jpg?v=1627674685 480w" sizes="(max-width: 763px) 100vw, 763px" /></figure>



<h3 class="wp-block-heading">Step 3: 調整對比（二極化）</h3>



<p>透過這一個步驟選擇一個較偏好的二極化的數值，這個是透過去調整亮度與對比值，幾乎所有的影像處理軟體都有這樣的功能，這個功能可以有效去除顏色較淺的雜訊。</p>



<p>不知道如何設定的話，就設在正中間。愈向左線條會較細，愈向右線條較粗。</p>



<p>與守寫字網站相比，自己手工去處理，可以微調的地方會較多，相對也會比較花時間，可以產出的作品有機會比守寫字網站佳。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1833" height="630" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side.jpg?v=1627675016" alt="" class="wp-image-1486" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side.jpg?v=1627675016 1833w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-1536x528.jpg?v=1627675016 1536w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-830x285.jpg?v=1627675016 830w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-230x79.jpg?v=1627675016 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-350x120.jpg?v=1627675016 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.43.47-AM-side-480x165.jpg?v=1627675016 480w" sizes="(max-width: 1833px) 100vw, 1833px" /></figure>



<h3 class="wp-block-heading">Step 4: 使用模糊讓線條平滑（建議略過）</h3>



<p>透過模糊(Blur)與調整對比，就可以讓線條或輪廓較平滑。</p>



<p>Max建議是不要做，原因：</p>



<ul class="wp-block-list"><li>1:這一個步驟是可以讓線條平滑沒錯，相對也失去了細節，讓筆畫交叉的地方產生暈染的效果。<meta charset="utf-8"></li><li>2:使用繪圖軟體的線條工具(Line Tool)或貝茲曲線工具(Bezier Curve Tool)把線條變也行。</li><li>3:最後在字體編輯工具裡，也可以很容易讓線條平滑。</li></ul>



<p>如果要套用這一個效果，建議模糊程度低於 5.0px 也許會較好。這個沒有絕對，有些字體增加了暈染效果也滿漂亮的，略有詩意。</p>



<p>附註：也可以使用選取工具(Selection Tool) 先全選之後，反向選取不套用效果的區塊，例筆筆畫相交的時，這樣也可以避開暈染的問題。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1994" height="630" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side.jpg?v=1627675740" alt="" class="wp-image-1488" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side.jpg?v=1627675740 1994w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-1536x485.jpg?v=1627675740 1536w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-830x262.jpg?v=1627675740 830w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-230x73.jpg?v=1627675740 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-350x111.jpg?v=1627675740 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.56.00-AM-side-480x152.jpg?v=1627675740 480w" sizes="(max-width: 1994px) 100vw, 1994px" /></figure>



<h3 class="wp-block-heading">Step 5: 使用畫畫工具填入白色與黑色</h3>



<p>類比世界的筆的墨在筆尖輸出時，沒辦法在不同情況下都持續產出相同墨水，因此有幾個特色：</p>



<ul class="wp-block-list"><li>同一筆畫，有時下筆的開頭的顏色較淺，在調高對比值(二極化)之後，預期應該保留的筆畫就消失了。</li><li>同一筆畫，移動速度較快時，線條二側顏色較淺，在調高對比值(二極化)之後，預期應該保留的筆寬就消失了。</li></ul>



<p>對於被消失的區域，希望未來的字體該區域是有顏色的，我們就手動用畫畫工具畫上去，就行了。</p>



<p>例如：希望線條分開，就畫上白色線條</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="912" height="958" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool.jpg" alt="" class="wp-image-1489" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool.jpg?v=1627677531 912w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool-830x872.jpg?v=1627677531 830w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool-230x242.jpg?v=1627677531 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool-350x368.jpg?v=1627677531 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-1.57.37-AM-2-line-tool-480x504.jpg?v=1627677531 480w" sizes="(max-width: 912px) 100vw, 912px" /></figure>



<p>鋸齒狀的地方，在波段平均值以下畫上黑色，波浪上方畫上白色線條。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="954" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.03.22-AM-2-1024x954.jpg?v=1627677799" alt="" class="wp-image-1490"/></figure>



<p>附註：不用做的很完美，因為待會在字體軟體會再做一次。</p>



<p>最後，另存檔案為 bmp 格式 。把有字的圖片依照該字命名，例如：聿.bmp</p>



<h3 class="wp-block-heading"><meta charset="utf-8">Step 6: 匯入圖片到字型檔</h3>



<p>6.1: .bmp (點陣圖) 轉 .svg (向量圖)</p>



<p>可以服用指令：</p>



<pre class="wp-block-preformatted">potrace -b svg -u 50 聿.bmp</pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="647" height="107" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM.jpg" alt="" class="wp-image-1491" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM.jpg?v=1627678411 647w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM-640x107.jpg?v=1627678411 640w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM-230x38.jpg?v=1627678411 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM-350x58.jpg?v=1627678411 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.12.14-AM-480x79.jpg?v=1627678411 480w" sizes="(max-width: 647px) 100vw, 647px" /></figure>



<p>這時就會產生 聿.svg</p>



<p>6.2: 增加空白的字到字體檔</p>



<p>服用指令：</p>



<pre class="wp-block-preformatted">new_glyph.py --output jason5.sfdir --string 聿 --width 1024</pre>



<p>詳細用法，參考：<br><a href="https://codereview.max-everyday.com/new-glyph/">https://codereview.max-everyday.com/new-glyph/</a></p>



<p>6.3: 向量檔匯入字體檔</p>



<p>可以服用指令：</p>



<pre class="wp-block-preformatted">import_svg.py --input jason5.sfdir --svg_path . --filename_pattern="%s.svg"
<meta charset="utf-8"></pre>



<p>詳細用法，參考：<br><a href="https://codereview.max-everyday.com/import-svg-to-font/">https://codereview.max-everyday.com/import-svg-to-font/</a></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="648" height="397" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM.jpg" alt="" class="wp-image-1503" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM.jpg?v=1627681065 648w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM-230x141.jpg?v=1627681065 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM-350x214.jpg?v=1627681065 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.13.52-AM-480x294.jpg?v=1627681065 480w" sizes="(max-width: 648px) 100vw, 648px" /></figure>



<p>說明：可以看到 聿.svg 已成功匯入到字體檔。</p>



<p>第一個版本的字體，效果就滿好的：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="749" height="704" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM.jpg" alt="" class="wp-image-1504" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM.jpg?v=1627681234 749w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM-230x216.jpg?v=1627681234 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM-350x329.jpg?v=1627681234 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.15.07-AM-480x451.jpg?v=1627681234 480w" sizes="(max-width: 749px) 100vw, 749px" /></figure>



<h3 class="wp-block-heading">Step 7: 在FontForge裡合併節點</h3>



<p>點陣圖在轉向量圖時，針對曲線的判斷較弱，大多是很多細小的直線。</p>



<ul class="wp-block-list"><li>我們先選取 1/4 個圓後，按下 Cmd+M 鍵做節點的合併，就會變成漂亮的曲線。如果遇到合併變成直線，請先按 Cmd + Z 復原，再選取較少，或只選一個節點，進行合併，也會變漂亮曲線。</li><li>有時連續的直線，卻是很多短的線組成，也是選取後，按 Cmd+M 合併即可。</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="630" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.26.35-AM-side-1024x630.jpg?v=1627681386" alt="" class="wp-image-1505"/></figure>



<p>說明：左圖的右下角選取 1/4 個圓，按下合併後，就會變成右圖。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="537" height="617" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM.jpg" alt="" class="wp-image-1506" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM.jpg?v=1627681805 537w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM-230x264.jpg?v=1627681805 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM-350x402.jpg?v=1627681805 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/Screen-Shot-2021-07-31-at-2.32.27-AM-480x552.jpg?v=1627681805 480w" sizes="(max-width: 537px) 100vw, 537px" /></figure>



<p>說明：右上角的2個大曲線，是合併的結果，左圖的鋸齒邊，選取後按Cmd+M 合併就會變平滑。</p>



<p>以上就是全部了，在FontForge 使用匯出功能就可以拿到字體檔了。</p>



<hr class="wp-block-separator"/>



<p>字體檔放到原作者的圖上做對照：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="588" height="588" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final.jpg" alt="" class="wp-image-1507" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final.jpg?v=1627682088 588w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-300x300.jpg?v=1627682088 300w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-150x150.jpg?v=1627682088 150w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-230x230.jpg?v=1627682088 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-350x350.jpg?v=1627682088 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-480x480.jpg?v=1627682088 480w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-final-50x50.jpg?v=1627682088 50w" sizes="(max-width: 588px) 100vw, 588px" /></figure>



<p>說明：粉紅色半透明的部份，是這次匯入的作果。</p>



<p>與用守寫字網站，並原作者處理的結果相比較：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="673" height="727" src="https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent.jpg" alt="" class="wp-image-1508" srcset="https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent.jpg?v=1627682218 673w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent-230x248.jpg?v=1627682218 230w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent-350x378.jpg?v=1627682218 350w, https://codereview.max-everyday.com/wp-content/uploads/2021/07/test-author-fade-transparent-480x519.jpg?v=1627682218 480w" sizes="(max-width: 673px) 100vw, 673px" /></figure>



<p><meta charset="utf-8">說明：<meta charset="utf-8">淺藍色半透明的部份，是這次匯入的作果。</p>



<p>原作者的筆畫平均值會較細，有可能是守寫字網站的自動化處理在對比（二極化）的選擇是使用 127(正中間)，所以比較細一點。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>向量檔匯入字體檔</title>
		<link>https://codereview.max-everyday.com/import-svg-to-font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Fri, 30 Jul 2021 21:27:35 +0000</pubDate>
				<category><![CDATA[字串處理]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1497</guid>

					<description><![CDATA[想要擁有專屬字型。手寫後轉成 SVG 圖檔。 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>想要擁有專屬字型。手寫後轉成 SVG 圖檔。一個一個手動匯入太慢。這份 Python 腳本可以自動化。它利用 FontForge 引擎處理。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/import_svg.py">https://github.com/max32002/MaxFontScripts/blob/master/import_svg.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>fontforge import_svg.py -i your-project.sfdir -o your-new-font.ttf --svg_path . </code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><strong>input</strong>:<code>&nbsp;Font Forge 的 .sfdir 資料夾路徑</code>, 或是字型的檔案, 建議使用 .ttf 當作輸入, 效率會快很多. 但是, 如果遇到一直匯入失敗的情況, 建議改用 .sfdir 的輸入格式.</li>



<li><strong>output</strong>: save a new font forge project name, 預設值是空的, 不輸入即可直接更新到 input font forge project.建議使用 .ttf 當作輸入, 效率會快很多. </li>



<li><strong>filename_pattern</strong>: 檔名的規則, 應該是沒什麼好修改的, 用預設值即可.</li>



<li><strong>filename_rule</strong>: 在檔名規則裡的變數來源，預設值是 char 。這個參數只接受4個值：[&#8216;char&#8217;, &#8216;unicode_hex&#8217;, &#8216;unicode_int&#8217;]，分別是字元，unicode 16進位值，unicode 10進位值. 使用 char 是很方便, 但問題是相容性不好, 也容易出錯, 尤其是擴充字元的部份, 很多作業系統不充許檔名使用, 預設值是使用 unicode_int.</li>



<li><strong>width</strong>: 字形寬度，預設值為 1000, 可以不指定 width 內容, 程式會從 svg_path 中的第一個 .svg 檔讀取其內容來判斷匯入字型的寬度。</li>
</ul>



<p>說明, 由於需要使用到 fontforge library, 所以要透過 fontforge 執行這一個 python script.</p>



<p>圖片檔名要跟字對應。腳本提供三種來源。第一種是直接用字元當檔名。例如 阿.svg。設定為 char 模式。第二種是 Unicode 十進位。例如 38463.svg。設定為 unicode_int。第三種是十六進位。例如 963f.svg。設定為 unicode_hex。</p>



<p>在操作大型的字型檔時, 往往需要很高的記憶體, 一但記憶體不足, fontforge 就會crash. Window 平台上新的版本的 fontforge 是 32 位元版本, 因為 macOS / Linux 長期都是 64位元, 反而在 macOS / Linux 可以順利地直接處理大型的字型檔.</p>



<p>實際測試在 Windows 32位元版本, 當程式內部使用的記憶體超過 2.1GB 的 RAM, fontforge 程式就會閃退 crash, 針對會需要處理大型的字型檔, 請改安裝 64位元版本, fontforge x64下載用傳送門:<br><a href="https://sourceforge.net/projects/fontforgebuilds/files/x86_64/Portable/">https://sourceforge.net/projects/fontforgebuilds/files/x86_64/Portable/</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">錯誤排除</h2>



<p><strong>執行指令:</strong></p>



<pre class="wp-block-code"><code>fontforge import_svg.py --input OldMaruko2CJKjp-Regular.ttf --output OldMaruko3CJKjp-Regular.ttf --svg_path my-svg-folder --begin 8000 --end 9000</code></pre>



<p></p>



<p><strong>回傳錯誤:</strong></p>



<pre class="wp-block-preformatted">Open font: OldMaruko2CJKjp-Regular.ttf<br>Save dir: OldMaruko3CJKjp-Regular.ttf<br>Svg path: my-svg-folder<br>Filename pattern: %s.svg<br><br>Source font total glyph: 44922<br>Processing glyph: 8000<br>Processing glyph: 9000<br>Imported count: 1001<br>Attempt to output -43598 into a 16-bit field. It will be truncated and the file may not be useful.</pre>



<p>說明, 使用輸入 .ttf 載入速度快, 改成 .sfdir 為輸入格式, 除了載入字型的輸入變極慢之外, 結果匯入  svg 之後, 還是一樣出錯, 這似乎可能是字型檔案出錯.</p>



<p>要知道是字型檔案出錯, 只要使用另存字型檔的功能, 就可以知道字型檔是不是壞掉, 參考:<br><a href="https://codereview.max-everyday.com/font-to-fontforge/">https://codereview.max-everyday.com/font-to-fontforge/</a></p>



<p><strong>fontforge 上的討論:</strong><br>Lookup removal related &#8220;Attempt to output n into a 16-bit field.&#8221; failure<br><a href="https://github.com/fontforge/fontforge/issues/5228">https://github.com/fontforge/fontforge/issues/5228</a></p>



<p>如果是匯入的svg 造成字型檔損壞, 只要調整匯入的範圍即可知道.</p>



<p>解法是讓來源的字型檔變正常, 參考看看:<br><a href="https://stackoverflow.max-everyday.com/2022/09/fontforge-font-pros-settings-wrong/">https://stackoverflow.max-everyday.com/2022/09/fontforge-font-pros-settings-wrong/</a></p>



<p><strong>結論:</strong></p>



<ul class="wp-block-list">
<li>使用 .sfdir 或 .ttf 在匯入的時候, 都要先直接用另存 .ttf 的功能來測試輸入用的字型專案或.ttf 檔是否能正常存檔.</li>



<li>雖然上面有錯誤訊息, 但實際上字型檔一切功能都正常, 只是 warning 訊息, &#8220;may not be useful&#8221; 是可以能會發生, 實際上很高機率還可以繼續使用.</li>
</ul>



<p><strong>常見問題與提醒:</strong></p>



<p>可以直接在指令修改字體名字。familyname 是系列名稱。fontname 是系統內部識別名。width 可以調整字元寬度。預設值通常是 1000。如果圖片不需要自動縮放。不要加上 enable_scale 參數。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">簡化 svg 檔</h2>



<ul class="wp-block-list">
<li>Scour<br><a href="https://github.com/scour-project/scour">https://github.com/scour-project/scour</a></li>



<li>picosvg<br><a href="https://github.com/googlefonts/picosvg">https://github.com/googlefonts/picosvg</a></li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章</h2>



<ul class="wp-block-list">
<li>增加空白文字到字體檔<br><meta charset="utf-8"><a href="https://codereview.max-everyday.com/new-glyph/">https://codereview.max-everyday.com/new-glyph/</a></li>



<li>以描摹方式建立或更新字型<br><a href="https://codereview.max-everyday.com/create-new-font-by-draw/">https://codereview.max-everyday.com/create-new-font-by-draw/</a></li>



<li>dumping SVG outlines into a FontForge file<br><a href="https://stackoverflow.max-everyday.com/2021/06/dumping-svg-outlines-into-a-fontforge-file/">https://stackoverflow.max-everyday.com/2021/06/dumping-svg-outlines-into-a-fontforge-file/</a></li>
</ul>



<p></p>



<p></p>



<p></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
