跳過到頁腳內容
使用 IRONOCR

電腦視覺如何提升 OCR 的文字辨識準確度

從影像中提取文字聽起來很簡單,但如果文件歪斜、褪色或在光線不足的情況下拍攝,那就另當別論了。 電腦視覺正是將光學字元辨識從一個脆弱的過程轉變為一個可靠的過程。 透過在資料擷取之前應用智慧型影像分析,OCR 系統可以實現接近人類層級的辨識精度,適用於原本會產生亂碼結果的掃描文件。

結合電腦視覺的光學字元辨識 (OCR) 已成為數位轉型計畫的基礎技術,它能夠消除各種文件類型的手動資料輸入。本指南將探討如何整合這些技術,從而顯著提升.NET應用程式中的文字辨識能力。 從用於校正低品質掃描的預處理過濾器到驅動現代 OCR 引擎的神經網路架構,請理解這些概念使您能夠建立能夠優雅地處理現實世界輸入影像的文件處理系統。

若要跟隨下面的程式碼範例進行操作,請透過NuGet安裝IronOCR :

dotnet add package IronOcr
dotnet add package IronOcr
SHELL

或使用NuGet套件管理器控制台:

Install-Package IronOcr
Install-Package IronOcr
SHELL

安裝前,請造訪IronOCR NuGet套件頁面以確認最新版本。

電腦視覺與OCR之間有何關係?

電腦視覺涵蓋了教導機器解釋視覺訊息的更廣泛領域,而OCR 則專門專注於將圖像檔案中的印刷或手寫文字轉換為機器編碼文字。 光學字元辨識是電腦視覺領域的一個專門應用,它利用了許多與影像分析和模式識別相同的底層技術。

現代OCR流程由三個相互關聯的階段組成。 文字偵測功能可以辨識掃描影像中包含單一字元的文字區域,並將這些區域與背景、圖形和其他視覺元素隔離。 影像預處理隨後增強這些檢測到的區域,校正失真並提高對比度,使字元影像更易於區分。 最後,字元辨識應用模式匹配和神經網路推理,將每個儲存的字形的視覺表示轉換為相應的數位文字。

傳統的OCR技術在任何一個階段遇到不完美的輸入時都會遇到困難。 稍微旋轉的掃描件可能會產生完全無意義的結果,而低解析度的輸入影像或帶有背景圖案的列印文件通常會完全失敗。 電腦視覺技術透過使每個流程階段更具適應性和彈性來克服這些限制,從而能夠成功識別商業文件、銀行對帳單,甚至是手寫筆記。

在.NET專案中查看 OCR 功能的最快方法是執行一次基本識別測試:

using IronOcr;

// Initialize the optical character reader
var ocr = new IronTesseract();

// Load scanned document or image file
using var input = new OcrInput();
input.LoadImage("document.png");

// Perform text recognition and data extraction
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;

// Initialize the optical character reader
var ocr = new IronTesseract();

// Load scanned document or image file
using var input = new OcrInput();
input.LoadImage("document.png");

// Perform text recognition and data extraction
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
$vbLabelText   $csharpLabel

上面的程式碼示範了使用IronOCR 的最簡單的OCR 工作流程IronTesseract 類別為 Tesseract 5 引擎提供了一個託管包裝器,而 OcrInput 則處理圖像檔案載入和格式轉換。 對於乾淨、格式良好的文字文件,這種基本的光學字元辨識方法通常就足夠了。 然而,現實世界中掃描的文件很少能以完美狀態到達,因此預處理對於準確提取文字至關重要。

輸入

如何使用電腦視覺結合OCR技術提高IronOCR文字辨識的準確率:圖1 - 輸入影像範例

輸出

如何使用電腦視覺結合OCR技術提高IronOCR文字辨識的準確率:圖2 - 控制台輸出

影像預處理如何提高文字辨識率?

影像預處理應用電腦視覺操作來提高輸入影像的質量,然後再由 OCR 引擎進行分析。 這些轉換解決了 OCR 失敗的最常見原因:旋轉、雜訊、低對比度和解析度不足。 每一種預處理技術都針對特定的影像缺陷,將它們策略性地結合起來可以挽救原本無法讀取的列印文件和掃描影像。

傾斜校正可以修正以一定角度掃描文件時發生的旋轉錯位。 即使是輕微的旋轉也會對 OCR 的準確性產生顯著影響,因為光學字元辨識軟體期望文字行水平排列。 傾斜校正操作分析文字行角度,並應用校正旋轉來對齊內容。

降噪功能可以去除數位偽影、斑點和掃描器引入的失真,這些都可能被誤解為單一字元。 背景圖案、灰塵痕跡和壓縮偽影都會產生噪聲,幹擾原始影像中字元的準確分割。

二值化將影像轉換為純黑白影像,消除色彩資訊和灰階漸層。 這種簡化有助於識別引擎更明確地區分印刷文字和背景,尤其是在彩色紙張或印刷褪色的文件中,識別字母會變得非常困難。

解析度增強可以提高低品質掃描件或照片的像素密度。更高的解析度能為OCR軟體提供更多細節,使其能夠分析更多細節,從而提高區分相似字元的能力,即使在輸入品質較差的情況下也能成功識別。

using IronOcr;

var ocr = new IronTesseract();

// Load poor quality scan for document processing
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

// Apply preprocessing filters for improved accuracy
input.Deskew();                   // Correct rotational skew in scanned image
input.DeNoise();                  // Remove digital artifacts from input
input.Binarize();                 // Convert to black and white for text extraction
input.EnhanceResolution(300);     // Boost to 300 DPI for single character clarity

OcrResult result = ocr.Read(input);
Console.WriteLine($"Extracted: {result.Text}");
using IronOcr;

var ocr = new IronTesseract();

// Load poor quality scan for document processing
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

// Apply preprocessing filters for improved accuracy
input.Deskew();                   // Correct rotational skew in scanned image
input.DeNoise();                  // Remove digital artifacts from input
input.Binarize();                 // Convert to black and white for text extraction
input.EnhanceResolution(300);     // Boost to 300 DPI for single character clarity

OcrResult result = ocr.Read(input);
Console.WriteLine($"Extracted: {result.Text}");
$vbLabelText   $csharpLabel

此範例在執行 OCR 之前串聯多個預處理過濾器Deskew() 方法分析文件並應用旋轉校正,而 DeNoise() 去除文字影像中的斑點和偽影。 Binarize() 呼叫將掃描的影像轉換為純黑白影像,以便更清晰地擷取文字;而 EnhanceResolution() 呼叫將影像解析度提升至 300 DPI,這是準確辨識字元的建議最低解析度。

過濾器的應用順序很重要。 傾斜校正通常應該在影像處理鏈的早期進行,因為後續的濾波器在正確對齊的影像上效果更好。 在二值化之前進行降噪有助於防止偽影永久編碼到黑白轉換中。 針對特定文件類型嘗試不同的過濾器組合,通常可以揭示給定用例的最佳順序,無論 OCR 應用程式處理的是發票、收據、病人記錄還是掃描的合約。

如何選擇合適的預處理濾波器組合?

選擇合適的篩選條件組合取決於輸入文件的性質。 相機拍攝的具有透視畸變的影像,先進行傾斜校正,然後再進行降噪處理,效果會更好。 傳真或影印的文件通常需要進行強力二值化處理,以消除字元周圍的灰色光暈。 低解析度掃描需要先進行解析度增強,然後再進行其他任何濾波處理,因為在降噪之前進行放大可以避免放大壓縮偽影。

一個切實可行的方法是將文件來源分類——掃描器、相機、傳真、PDF 柵格化——並為每種來源應用客製化的過濾器鏈。 IronOCR支援在一次 OcrInput 過程中連結任意數量的過濾器,因此您可以在配置中定義每個來源的配置文件,並在運行時應用它們,而無需重寫識別邏輯。

現代OCR技術採用哪些深度學習模式?

現代 OCR 引擎依賴深度學習架構,這徹底改變了文字辨識的準確性。 與將字元與預定義模板進行匹配的傳統方法不同,基於神經網路的 OCR 模型可以從大量的訓練資料集中學習識別文字模式,使其能夠更有效地處理字體變化、手寫風格和劣化圖像。 這種機器學習方法是當今功能最強大的OCR解決方案的驅動力。

識別流程通常結合兩種神經網路類型。卷積神經網路(CNN)擅長從影像中提取特徵。 這些網路透過多層處理輸入影像,逐步識別越來越複雜的模式——從基本的邊緣和曲線到完整的字元形狀。卷積神經網路(CNN)產生特徵圖,對文字區域的視覺特徵進行編碼,從而能夠更準確地處理印刷文字和手寫文字。

然後,長短期記憶(LSTM)網絡將這些特徵作為序列進行處理,從而識別出數字文本是按特定順序流動的。 LSTM 能夠記住先前的輸入,從而理解上下文並處理書面語言的順序性。 這種組合——通常被稱為CRNN (卷積循環神經網路)——構成了現代 OCR 準確性的支柱,並實現了跨多種語言的智慧字元辨識。

IronOCR所使用的Tesseract 5 引擎實現了這種基於 LSTM 的架構,與先前完全依賴傳統模式識別的版本相比,這是一個重大進步。 神經網路方法可以處理特定字體、部分遮蔽和影像退化等問題,而這些問題是基於模板的 OCR 系統無法解決的。

using IronOcr;

var ocr = new IronTesseract();

// Configure OCR engine for multilingual text recognition
ocr.Language = OcrLanguage.English;  // IronOCR supports 125+ languages

// Process PDF with mixed handwriting styles and printed text
using var input = new OcrInput("web-report.pdf");
input.Deskew();

OcrResult result = ocr.Read(input);

// Access detailed recognition data including text regions
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}
using IronOcr;

var ocr = new IronTesseract();

// Configure OCR engine for multilingual text recognition
ocr.Language = OcrLanguage.English;  // IronOCR supports 125+ languages

// Process PDF with mixed handwriting styles and printed text
using var input = new OcrInput("web-report.pdf");
input.Deskew();

OcrResult result = ocr.Read(input);

// Access detailed recognition data including text regions
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}
$vbLabelText   $csharpLabel

IronTesseract 類別透過簡潔的.NET介面提供對 Tesseract 5 神經網路功能的存取。 傳回的OcrResult物件不僅包含提取的文本,還包含結構化數據,包括頁面、段落、行和單字及其置信度分數和邊界座標。

輸入

如何使用電腦視覺結合OCR技術提高IronOCR文字辨識的準確率:圖3 - PDF輸入範例

輸出

如何使用IronOCR結合電腦視覺技術提高文字辨識準確率:圖4 - OCR輸出

這種結構化的輸出對於除簡單文本提取之外的應用也很有價值。 文檔處理系統可以利用單字位置來理解複雜的佈局,而品質保證工作流程可以標記置信度低的區域以供人工審核。 神經網路架構透過在識別文字的同時提供豐富的元數據,使這一切成為可能,從而實現基於人工智慧的 OCR 解決方案,高效地處理大量非結構化資料。

IronOCR如何處理多語言文件?

IronOCR支援超過 125 種語言,每種語言都由專門的 Tesseract LSTM 語言模型提供支援。 您可以透過在 @@--CODE-326--CODE-327--CODE-327 上設定 @@--CODE-325--CODE-326 的 @@--CODE-326 屬性來選擇語言,然後再呼叫 @@--CODE-327--CODE-327。 對於混合兩種語言的文檔——例如,德語合約和英語腳註——您可以同時指定多種語言,引擎會根據每個文字區域應用最合適的模型。

語言包以NuGet包的形式分發,因此您只需下載應用程式所需的模型。 這樣既能確保單一語言導向的應用程式部署規模可控,又能在需要時提供完整的多語言支援。

如何為表單和表格啟用基於區域的 OCR?

基於區域的 OCR 將識別範圍限制在影像的特定區域,這在文件包含特定感興趣區域(例如表單欄位、發票行項目或表格單元格)時非常有用。 這種有針對性的方法將計算資源集中在相關內容上,從而提高了速度和準確性。

using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("invoice.jpg");

// Define a crop region for the total amount field (x, y, width, height in pixels)
var totalRegion = new CropRectangle(x: 600, y: 800, width: 300, height: 50);
input.AddRegion(totalRegion);

OcrResult result = ocr.Read(input);
Console.WriteLine($"Invoice total: {result.Text}");
using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("invoice.jpg");

// Define a crop region for the total amount field (x, y, width, height in pixels)
var totalRegion = new CropRectangle(x: 600, y: 800, width: 300, height: 50);
input.AddRegion(totalRegion);

OcrResult result = ocr.Read(input);
Console.WriteLine($"Invoice total: {result.Text}");
$vbLabelText   $csharpLabel

將基於區域的 OCR 與置信度閾值結合,可以對資料品質進行精細控制。 對於財務文件和法律資料,將置信度低於 85% 的字詞標記出來進行二次審核是一個實用的基準。您可以根據每個來源的掃描質量,針對每種文件類型調整閾值。

有關基於區域的 OCR 和裁剪矩形的更多信息,請參閱IronOCR文件。

開發者如何透過程式設計方式優化 OCR 準確率?

除了套用標準預處理過濾器之外,您還可以針對特定文件類型和品質要求微調 OCR 的效能。 置信度評分、自動過濾器優化和可搜尋 PDF 生成等功能,有助於最大限度地提高生產應用中的識別準確率,這些應用必須能夠可靠地識別各種文件類型中的文字。

置信度分數表示引擎對每個已識別元素的確定程度。 分析這些分數有助於識別可能需要人工驗證或替代處理方法的難題領域。 應用程式可以設定置信度閾值,低於該閾值的結果將被標記出來進行審核——這對於需要高精度的敏感文件至關重要。

using IronOcr;

var ocr = new IronTesseract();

// Load business document for OCR processing
using var input = new OcrInput("receipt.jpg");

// Let the system determine optimal preprocessing for OCR accuracy
string suggestedCode = OcrInputFilterWizard.Run(
    "receipt.jpg",
    out double confidence,
    ocr);

Console.WriteLine($"Achieved confidence: {confidence:P1}");
Console.WriteLine($"Optimal filter chain: {suggestedCode}");

// Apply recommended filters for successful recognition
input.DeNoise();
input.Deskew();

OcrResult result = ocr.Read(input);

// Analyze word-level confidence for extracted text
foreach (var word in result.Words)
{
    if (word.Confidence < 0.85)
    {
        Console.WriteLine($"Low confidence: '{word.Text}' ({word.Confidence:P0})");
    }
}
using IronOcr;

var ocr = new IronTesseract();

// Load business document for OCR processing
using var input = new OcrInput("receipt.jpg");

// Let the system determine optimal preprocessing for OCR accuracy
string suggestedCode = OcrInputFilterWizard.Run(
    "receipt.jpg",
    out double confidence,
    ocr);

Console.WriteLine($"Achieved confidence: {confidence:P1}");
Console.WriteLine($"Optimal filter chain: {suggestedCode}");

// Apply recommended filters for successful recognition
input.DeNoise();
input.Deskew();

OcrResult result = ocr.Read(input);

// Analyze word-level confidence for extracted text
foreach (var word in result.Words)
{
    if (word.Confidence < 0.85)
    {
        Console.WriteLine($"Low confidence: '{word.Text}' ({word.Confidence:P0})");
    }
}
$vbLabelText   $csharpLabel

OcrInputFilterWizard分析影像並測試各種濾波器組合,以確定哪個預處理鏈產生置信度最高的結果。 這種自動化方法消除了處理不熟悉的文件類型時的猜測。此精靈會傳回達到的置信度等級以及重現最佳配置所需的程式碼,從而簡化業務流程的 OCR 應用程式開發。

循環中演示的詞級置信度分析提供了精細的品質評估。 處理財務文件、病人記錄或法律資料的應用通常需要這種程度的審查,以確保提取的資料符合準確性標準。 置信度低於閾值的字詞可以觸發二次驗證流程或替代識別嘗試,從而支援對可靠性有要求的資料管理工作流程。

如何從掃描文件產生可搜尋的PDF?

對於需要轉換為可搜尋存檔的文檔, IronOCR可以產生可搜尋的 PDF ,將識別出的文字層嵌入到原始圖像下方,從而實現全文搜索,同時保持視覺保真度。 此功能可將掃描文件轉換為適合長期存檔、法律取證工作流程或企業內容管理系統的數位格式。

using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput("scanned-contract.pdf");
input.Deskew();
input.DeNoise();

OcrResult result = ocr.Read(input);

// Export as searchable PDF with embedded text layer
result.SaveAsSearchablePdf("searchable-contract.pdf");
Console.WriteLine("Searchable PDF saved successfully.");
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput("scanned-contract.pdf");
input.Deskew();
input.DeNoise();

OcrResult result = ocr.Read(input);

// Export as searchable PDF with embedded text layer
result.SaveAsSearchablePdf("searchable-contract.pdf");
Console.WriteLine("Searchable PDF saved successfully.");
$vbLabelText   $csharpLabel

生成的文件保留了原始掃描件的視覺外觀,同時添加了一個隱藏的文字層,搜尋工具和螢幕閱讀器可以存取該文字層。 這是針對符合合規性或可訪問性要求的文件數位化項目的標準輸出格式。

如何比較不同文件類型的 OCR 效能?

不同的文件類別——列印表格、手寫筆記、低品質傳真傳輸和高解析度相機拍攝的圖像——對預處理和識別設定的反應各不相同。 透過對每個類別中的代表性樣本進行基準測試,可以發現準確度差距所在以及需要調整哪些過濾器。

按文檔類型劃分的 OCR 預處理建議
文件類型 推薦篩選條件 典型精度提升 主要挑戰
平板掃描文字 去斜,二值化 5-15% 輕微旋轉,陰影邊緣
相機拍攝的文件 去斜、降噪、增強分辨率 20-40% 透視變形、噪音
傳真/影印 二值化、去噪 15-30% 半色調圖案,對比度降低
Low-resolution scan (<150 DPI) 增強解析度(300)、相差校正 30-50% 像素密度不足
手寫筆記 二值化、去噪 10-25% 可變筆畫寬度,樣式變化

這些準確率的提高是基於學術 OCR 基準研究的預處理效果研究的方向性估計。 實際結果因掃描設備、文件年代和內容複​​雜程度而異。 使用 OcrInputFilterWizard 對您自己的樣本集運行,即可獲得特定於您的管道的經驗數據。

瀏覽IronOCR預處理過濾器的完整列表,以了解在調整管道時可用的所有選項。

IronOCR在生產文件處理方面的主要功能有哪些?

在生產環境中部署 OCR 時,除了基本的識別功能外, IronOCR 的幾項功能對於可靠性和吞吐量來說都非常重要。 了解這些特性有助於您設計出可擴展且不犧牲準確性的流程。

支援多種格式輸入IronOCR透過單一的統一 API 接受影像(PNG、JPEG、TIFF、BMP、GIF、WEBP)、PDF 檔案和多頁 TIFF 檔案。 這表示您可以處理來自掃描站、電子郵件附件或文件管理系統的任何格式,而無需編寫特定於格式的程式碼路徑。

執行緒安全性-- 當您建立單一實例並在執行緒之間共用它時,IronTesseract 類別是執行緒安全的。 對於高吞吐量應用,為每個執行緒建立一個實例,或使用實例池來避免底層 Tesseract 引擎上的鎖定爭用。

條碼和二維碼協同處理IronOCR可以一次從同一影像中讀取條碼和二維碼,在處理混合內容文件(如運輸標籤或產品庫存表)時,無需單獨的條碼庫。

輸出格式選項-除了純文字之外, IronOCR還可以傳回HOCR 格式的結構化數據,直接匯出為可搜尋的 PDF,並提供適合下游資料擷取工作流程的單字邊界框。

在最終確定架構之前,請查看完整的IronOCR功能概述,以了解所有功能。

下一步計劃是什麼?

電腦視覺技術從根本上改變了光學字元辨識技術,使其從只能處理完美輸入的技術轉變為能夠處理掃描文件、照片和劣化影像等複雜情況的技術。 預處理階段——去斜、去噪、二值化和分辨率增強——解決了物理捕獲缺陷,而 CNN-LSTM 等神經網路架構提供了腳本識別智能,可以準確地解釋各種字體和手寫風格。

對於.NET開發人員來說, IronOCR將這些功能打包到一個託管庫中,簡化了原生 Tesseract 集成,同時為生產使用添加了實用的增強功能。 自動預處理最佳化、詳細的置信度報告和結構化結果資料的結合,使得文件處理系統能夠可靠地處理各種真實世界的輸入——從列印文件到手寫筆記——並支援跨多種語言的多語言 OCR。

繼續前進:

下載IronOCR免費試用版,並使用本指南中的程式碼範例對您自己的文件進行測試。

  • 請參閱IronOCR教程,其中包含涵蓋常見用例(例如 PDF 文字擷取、表單欄位讀取和批次處理)的逐步演練。
  • 查閱IronOCR API 參考文檔,全面了解 OcrInputOcrResult 的功能。
  • 查看IronOCR授權選項,選擇適合您部署場景的方案

常見問題解答

電腦視覺如何提高OCR辨識準確率?

計算機視覺通過在識別之前進行圖像預處理來提高 OCR 的準確率。去斜校正、去噪、二值化和分辨率增強等技術糾正物理捕獲缺陷,這會使 OCR 引擎誤讀或漏讀字符。神經網絡模型進一步提高準確率,能夠學習識別跨字體、手寫風格和退化圖像的文本模式。

IronOCR 支援哪些預處理濾鏡?

IronOCR 支援通過 OcrInput API 的去斜校正、去噪、二值化、分辨率增強及其他多個濾鏡。您可以一次性鏈接多個濾鏡,並使用 OcrInputFilterWizard 自動發現給定文件類型的最佳濾鏡組合。

哪個深度學習模型支持 IronOCR?

IronOCR 由 Tesseract 5 提供支持,使用 LSTM(長短時記憶)神經網絡架構。與卷積特徵提取相結合,該 CRNN 模型比傳統模板基礎的 OCR 系統更有效地處理字體變化、部份遮遮擋及影像退化。

如何使用 IronOCR 進行基於區域的 OCR?

在OcrInput上使用AddRegion方法,並提供CropRectangle來定義目標區域的x, y坐標和寬度、高度(以像素為單位)。IronOCR會將識別限制在該區域,從而提高結構化文件(如表單和發票)的速度和準確性。

IronOCR可以從掃描的文件生成可搜尋的PDF嗎?

可以。在OcrInput上調用Read後,調用OcrResult對象的SaveAsSearchablePdf。這會產生一個PDF,將識別出的文字嵌入原始掃描圖像下方的隱藏層,使得可以全文檢索,同時保留文件的視覺外觀。

IronOCR支持多少種語言?

IronOCR支持超過125種語言。每種語言由專用的Tesseract LSTM模型支持,作為NuGet包分發。您可以同時指定多種語言,用於包含兩種或多種語言的文件。

預處理過濾器應以何種順序應用?

一般規則是先應用去斜,以便後續過濾器在正確對齊的圖像上工作。接下來是去噪再二值化,以防止在黑白轉換中永久編碼的假像。如果來源為低分辨率,則應盡早應用分辨率增強,因為在去噪前進行放大可以避免放大壓縮假像。

IronOCR中的置信分數如何工作?

IronOCR為OcrResult中每個識別出的詞返回0到1之間的置信分數。0.85或更高的分數通常被認為對商務文件是可靠的。低於您選擇的閾值的詞可以被標記為需要人工覆審或進行二次識別。

Kannaopat Udonpant
軟體工程師
在成為軟件工程師之前,Kannapat 從日本北海道大學完成了環境資源博士學位。在追逐學位期间,Kannapat 還成為了生產工程系一部份——汽車机器人實验室的成員。2022 年,他利用他的 C# 技能加入 Iron Software 的工程團隊, 專注於 IronPDF。Kannapat 珍惜他的工作,因為他直接向编写大部分 IronPDF 使用的代碼的開發者学习。除了同行学习,Kannapat 还喜欢在 Iron Software 工作的社交十环。当他不编写代碼或文檔時,Kannapat 通常在他的 PS5 上打游戏或重看《The Last of Us》。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me