跳過到頁腳內容
使用IRONBARCODE

如何創建Blazor QR Code掃描器

本文探討如何使用 .NET 函式庫 IronQR 將快速回應程式碼掃描器(QR 程式碼掃描器)整合到 Blazor 應用程式中。 二維碼是一種二維條碼,可以儲存比普通一維條碼多得多的資料。

Blazor 是微軟的一個框架,它允許開發人員建立單頁應用程式(使用 Blazor WebAssembly 應用程式),或使用 C# 建立互動式 Web 介面(Blazor Server,我們將在本指南中重點介紹它)。

IronQR 與 Blazor Server 的整合用於二維碼掃描,是一種充分利用兩種技術優勢的策略組合。 透過將 IronQR 與 Blazor 應用程式集成,您可以有效地處理二維碼的生成和掃描。 二維碼閱讀器的這項功能在各種商業環境中越來越受歡迎,例如庫存管理、票務系統和非接觸式資訊共享。

了解基礎知識

什麼是 Blazor 伺服器?

Blazor Server是 ASP.NET Core 平台的一部分,是一個 Web 應用程式框架。 它使開發人員能夠使用 C# 而不是 JavaScript 建立互動式 Web 使用者介面。 此伺服器端模型透過 SignalR 連接處理用戶互動來運行,從而提供即時網路功能。 這有助於開發者創建高效且互動性強的網頁應用程式。

IronQR簡介

IronQR是一個 .NET 函式庫,其突出之處在於能夠高精度地讀取、解釋和產生二維碼。 它提供了一系列功能,包括處理不同類型的二維碼內容的功能。 IronQR 的優勢在於其簡單易用,可以輕鬆整合到 .NET 應用程式中,因此對於希望整合和建立二維碼功能的開發人員來說,IronQR 是一個不錯的選擇。

如何建立 Blazor 二維碼掃描器

  1. 在 Visual Studio Code 中建立 Blazor 伺服器應用程式
  2. 使用 NuGet 套件管理器安裝二維碼類別庫
  3. 在 index.razor 檔案中使用 HTML 和 CSS 建立使用者介面
  4. 寫上傳文件處理邏輯
  5. 使用 QR 函式庫編寫 QR 掃描邏輯。
  6. 在文字方塊中顯示結果

設定環境

建立一個新的 Blazor 伺服器應用程式

啟動 Visual Studio,選擇"建立新專案"。在專案範本選擇畫面中,找到並選擇"Blazor 伺服器應用程式"範本。 按一下下一步。

如何建立 Blazor 二維碼掃描器:圖 1 - 找到要實現的正確模板

選擇範本後,輸入項目名稱和地點(其他所有選項保持預設值),然後按一下"下一步"按鈕。

如何建立 Blazor 二維碼掃描器:圖 2 - 設定項目詳情

現在選擇所需的 .NET Framework,然後點選建立按鈕。 它將創建一個 Blazor Server 應用程式。

如何建立 Blazor 二維碼掃描器:圖 3 - 選擇 .NET Framework 並建立項目

安裝 IronQR 庫

點選選單列中的"工具"。 從下拉式選單中選擇 NuGet 套件管理器。 從上下文功能表中,選擇"管理解決方案的 NuGet 套件"。 這將開啟 NuGet 套件管理器標籤。

如何建立 Blazor 二維碼掃描器:圖 4 - 存取 NuGet 套件管理器

在 NuGet 套件管理員中,在"瀏覽"標籤中搜尋"IronQR"。 然後在清單中找到"IronQR"軟體包。點擊"安裝"按鈕。

如何建立 Blazor 二維碼掃描器:圖 5 - 透過"瀏覽"標籤安裝 IronQR 軟體包

現在所有裝置都已安裝完畢,我們可以一起查看專案結構,並將所有內容整合到您的專案中。

實作二維碼掃描

建構使用者介面

二維碼掃描器的使用者介面主要建構於Index.razor檔案中。該檔案是 Blazor 伺服器專案的一部分,它結合了 HTML 和 Razor 語法來建立動態互動網頁。 該結構包括:

@page "/"
@using System.IO
@using Microsoft.AspNetCore.Components.Forms
@using IronQr
@using IronSoftware.Drawing
@inject IJSRuntime JSRuntime
<PageTitle>QR Code Scanner</PageTitle>
<div>
    <h1>QR Code Scanner</h1> 
    <InputFile OnChange="HandleSelectedFile" accept="image/*" class="file-input" />
    @if (!string.IsNullOrEmpty(qrImageSrcForDisplay))
    {
        <img src="@qrImageSrcForDisplay" alt="QR Code Image" class="qr-image" />
    }
    <button @onclick="ScanQRCode" disabled="@(!fileSelected)" class="button scan-button">Scan QR Code</button>
    @if (!string.IsNullOrEmpty(scannedText))
    {
        <div class="result-section">
            <input type="text" value="@scannedText" readonly class="result-input" />
            <button @onclick="CopyToClipboard" class="button copy-button">Copy</button>
        </div>
    }
</div>

標題和標題<PageTitle><h1>標籤分別定義頁面標題和主標題,為使用者設定上下文。

圖片上傳控制:一個<InputFile>此元件用於上傳二維碼圖像。 此元素僅接受影像文件,透過過濾掉不相關的文件類型來提升使用者體驗。

圖片顯示:圖片上傳後,會使用以下方式顯示:<img>標籤。 這種視覺回饋對於確保用戶上傳的檔案正確至關重要。

掃描按鈕:帶有@onclick=&quot;ScanQRCode&quot;標籤的按鈕會觸發掃描過程。 其可用性取決於是否選擇了文件,從而增強了介面的直覺性。

結果顯示:掃描的二維碼文字將顯示在文字輸入欄位中,以便於檢視。 使用者可以透過另一個按鈕將此文字複製到剪貼簿。

site.css 中的 CSS 樣式

二維碼掃描器的視覺美感和佈局在site.css檔案中定義。

.content {
    padding: 20px;
    margin: 10px auto; /* Centers the content */
    max-width: 500px; /* Sets a max width for the content */
    border-radius: 10px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.2);
    text-align: center;
}

.file-input, .result-input {
    margin: 10px 0;
    padding: 10px;
    border-radius: 5px;
    border: 1px solid #ddd;
    width: 100%;
}

.button {
    background-color: #4CAF50;
    color: white;
    border: none;
    cursor: pointer;
    padding: 10px;
    margin: 10px 0;
    border-radius: 5px;
    transition: background-color 0.3s, box-shadow 0.3s;
    width: auto; /* Adjusts button width */
    display: inline-block; /* Allows the width to adjust to content */
}

.button:hover {
    background-color: #45a049;
    box-shadow: 0 4px 8px rgba(0,0,0,0.2);
} 

.qr-image {
    max-width: 300px;
    max-height: 300px;
    display: block;
    margin: 10px auto;
    border-radius: 10px;
}

.result-section {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 100%;
}

.result-input {
    width: 100%;
    box-sizing: border-box;
}

.copy-button {
    margin-top: 10px;
    white-space: nowrap;
}

.content :此類別用於設定主要內容區域的樣式,賦予其定義的寬度、居中對齊方式以及微妙的陰影以增加深度。

.file-input, .result-input :這些類別設定檔輸入和結果顯示元素的樣式,確保它們在視覺上保持一致,並完全佔據容器的寬度。

.button :按鈕採用獨特的綠色背景、圓角和懸停效果,以提高使用者互動體驗。

.qr-image :套用於二維碼影像的樣式包括尺寸限制和自動居中邊距,使影像突出但不至於過於醒目。

.result-section :此功能確保結果部分中的元素居中對齊並適當間距。

處理文件上傳

HandleSelectedFile方法是二維碼掃描過程中的關鍵部分,用於處理使用者上傳的檔案並準備進行掃描。 當使用者透過以下方式選擇檔案時,將觸發此方法:<InputFile>成分。 以下程式碼展示了這一點:

private async Task HandleSelectedFile(InputFileChangeEventArgs e)
{
    selectedFile = e.File;
    fileSelected = true;
    var imagesDirectory = Path.Combine(Directory.GetCurrentDirectory(), "UploadedImages");
    Directory.CreateDirectory(imagesDirectory); // Ensure the directory exists

    // Use a GUID as the unique file name
    var uniqueFileName = Guid.NewGuid().ToString() + Path.GetExtension(selectedFile.Name);
    var fullPath = Path.Combine(imagesDirectory, uniqueFileName);

    await using (var fileStream = new FileStream(fullPath, FileMode.Create))
    {
        await selectedFile.OpenReadStream().CopyToAsync(fileStream);
    }

    // Store the full path in qrImageSrc for scanning
    qrImageSrc = fullPath;

    // Optionally, create a base64 string for displaying the image (if needed)
    byte[] imageBytes = await File.ReadAllBytesAsync(fullPath);
    var base64String = Convert.ToBase64String(imageBytes);
    qrImageSrcForDisplay = $"data:image/{Path.GetExtension(selectedFile.Name).TrimStart('.')};base64,{base64String}";
}
private async Task HandleSelectedFile(InputFileChangeEventArgs e)
{
    selectedFile = e.File;
    fileSelected = true;
    var imagesDirectory = Path.Combine(Directory.GetCurrentDirectory(), "UploadedImages");
    Directory.CreateDirectory(imagesDirectory); // Ensure the directory exists

    // Use a GUID as the unique file name
    var uniqueFileName = Guid.NewGuid().ToString() + Path.GetExtension(selectedFile.Name);
    var fullPath = Path.Combine(imagesDirectory, uniqueFileName);

    await using (var fileStream = new FileStream(fullPath, FileMode.Create))
    {
        await selectedFile.OpenReadStream().CopyToAsync(fileStream);
    }

    // Store the full path in qrImageSrc for scanning
    qrImageSrc = fullPath;

    // Optionally, create a base64 string for displaying the image (if needed)
    byte[] imageBytes = await File.ReadAllBytesAsync(fullPath);
    var base64String = Convert.ToBase64String(imageBytes);
    qrImageSrcForDisplay = $"data:image/{Path.GetExtension(selectedFile.Name).TrimStart('.')};base64,{base64String}";
}
Private Async Function HandleSelectedFile(ByVal e As InputFileChangeEventArgs) As Task
	selectedFile = e.File
	fileSelected = True
	Dim imagesDirectory = Path.Combine(Directory.GetCurrentDirectory(), "UploadedImages")
	Directory.CreateDirectory(imagesDirectory) ' Ensure the directory exists

	' Use a GUID as the unique file name
	Dim uniqueFileName = Guid.NewGuid().ToString() & Path.GetExtension(selectedFile.Name)
	Dim fullPath = Path.Combine(imagesDirectory, uniqueFileName)

'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'	await using(var fileStream = New FileStream(fullPath, FileMode.Create))
'	{
'		await selectedFile.OpenReadStream().CopyToAsync(fileStream);
'	}

	' Store the full path in qrImageSrc for scanning
	qrImageSrc = fullPath

	' Optionally, create a base64 string for displaying the image (if needed)
	Dim imageBytes() As Byte = Await File.ReadAllBytesAsync(fullPath)
	Dim base64String = Convert.ToBase64String(imageBytes)
	qrImageSrcForDisplay = $"data:image/{Path.GetExtension(selectedFile.Name).TrimStart("."c)};base64,{base64String}"
End Function
$vbLabelText   $csharpLabel

以下是其功能的詳細說明:

文件選擇和驗證:當使用者上傳文件時,該方法使用InputFileChangeEventArgs e捕獲文件的詳細資訊。 然後將selectedFile變數賦值給該文件,並將布林值fileSelected設為 true,表示輸入資料/文件已準備好進行處理。

建立檔案路徑:此方法準備一個目錄來儲存上傳的映像。 它使用Path.Combine建立指向"UploadedImages"目錄的路徑,並使用Directory.CreateDirectory確保目錄存在。 這一步驟對於有系統地整理上傳的文件至關重要。

產生唯一檔案名稱:為避免與現有檔案衝突,使用 GUID(全域唯一識別碼)附加到原始檔案副檔名來產生唯一檔案名稱。 這樣可以確保每個上傳的檔案都有唯一的識別。

儲存檔案:然後將檔案儲存到伺服器。 此方法建立一個指向新產生的檔案路徑的檔案流,並使用await selectedFile.OpenReadStream().CopyToAsync(fileStream)將上傳檔案的內容複製到此流中。 此步驟完成上傳過程。

準備顯示影像:檔案儲存後,需要將影像顯示給使用者進行確認。 該方法將檔案讀取到位元組數組中,並將其轉換為 base64 字串,以便直接嵌入到文字中。<img>標籤的src屬性。 這種轉換方式使得無需單獨向伺服器請求影像檔案即可顯示影像。

掃描二維碼

ScanQRCode方法是 Blazor Server 應用程式中二維碼掃描功能的核心。 此方法會取得上傳的圖像,並使用 IronQR 提取二維碼資料。

private async Task ScanQRCode()
{
    // Check if there is a valid image to work with
    if (string.IsNullOrEmpty(qrImageSrc)) return;

    try
    {
        var inputBmp = AnyBitmap.FromFile(qrImageSrc);
        QrImageInput imageInput = new QrImageInput(inputBmp);
        QrReader reader = new QrReader();
        IEnumerable<QrResult> results = reader.Read(imageInput);

        // Check if there are any results and if the first result contains text
        var firstResult = results.FirstOrDefault();
        if (firstResult != null && !string.IsNullOrWhiteSpace(firstResult.Value.ToString()))
        {
            scannedText = firstResult.Value.ToString();
        }
        else
        {
            scannedText = "QR value not found!";
        }
    }
    catch (Exception ex)
    {
        scannedText = "Error scanning QR code: " + ex.Message;
    }
}
private async Task ScanQRCode()
{
    // Check if there is a valid image to work with
    if (string.IsNullOrEmpty(qrImageSrc)) return;

    try
    {
        var inputBmp = AnyBitmap.FromFile(qrImageSrc);
        QrImageInput imageInput = new QrImageInput(inputBmp);
        QrReader reader = new QrReader();
        IEnumerable<QrResult> results = reader.Read(imageInput);

        // Check if there are any results and if the first result contains text
        var firstResult = results.FirstOrDefault();
        if (firstResult != null && !string.IsNullOrWhiteSpace(firstResult.Value.ToString()))
        {
            scannedText = firstResult.Value.ToString();
        }
        else
        {
            scannedText = "QR value not found!";
        }
    }
    catch (Exception ex)
    {
        scannedText = "Error scanning QR code: " + ex.Message;
    }
}
Private Async Function ScanQRCode() As Task
	' Check if there is a valid image to work with
	If String.IsNullOrEmpty(qrImageSrc) Then
		Return
	End If

	Try
		Dim inputBmp = AnyBitmap.FromFile(qrImageSrc)
		Dim imageInput As New QrImageInput(inputBmp)
		Dim reader As New QrReader()
		Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)

		' Check if there are any results and if the first result contains text
		Dim firstResult = results.FirstOrDefault()
		If firstResult IsNot Nothing AndAlso Not String.IsNullOrWhiteSpace(firstResult.Value.ToString()) Then
			scannedText = firstResult.Value.ToString()
		Else
			scannedText = "QR value not found!"
		End If
	Catch ex As Exception
		scannedText = "Error scanning QR code: " & ex.Message
	End Try
End Function
$vbLabelText   $csharpLabel

首先,此方法會檢查儲存上傳影像路徑的qrImageSrc變數是否為空。 此檢查可確保在繼續操作之前,存在有效的影像可供使用。

一旦確認影像已準備好進行處理,該方法就會繼續執行二維碼讀取的核心功能。 這包括幾個關鍵步驟,首先是將圖像從其儲存位置載入為適合二維碼分析的格式。 AnyBitmap.FromFile(qrImageSrc)方法可以實現這種轉換,該方法為掃描過程準備影像。

下一步是建立QrReader物件。 該物件是 IronQR 庫不可或缺的一部分,是解碼影像中二維碼的主要工具。 QrReader實例準備好後,應用程式將繼續掃描上傳的影像。 reader.Read(imageInput)函數負責執行此操作,它會有條不紊地搜尋影像中的二維碼並提取其資料。

掃描結果儲存在IEnumerable<QrResult>IEnumerable<QrResult>收藏。 然後仔細檢查該集合,找出第一個二維碼結果。 如果偵測到二維碼,且二維碼包含可讀文本,則擷取該文字並將其儲存在scannedText變數中。 但是,在找不到二維碼或二維碼不包含文字的情況下,應用程式會設定預設訊息,告知使用者未偵測到二維碼值。

成功掃描二維碼後,借助 Blazor 的雙向資料綁定功能,文字字串將顯示在文字輸入欄位中。 這是透過將scannedText變數綁定到文字輸入元素來實現的。 輸入欄位已設定為停用狀態,變成唯讀。 這種設計選擇著重於使用者查看結果並複製它,而不是編輯內容。

整個掃描過程都包含在 try-catch 區塊中,以防止掃描操作過程中出現任何意外錯誤。 這可能包括與影像檔案格式相關的問題,或讀取過程中出現的意外錯誤。 如果發生異常,則會捕獲該異常,並產生錯誤訊息顯示給使用者。 這種方法有助於追蹤問題,同時保持對使用者的透明度,從而提高應用程式的可靠性。

複製結果

為了啟用複製到剪貼簿功能, _Host.cshtml檔案中定義了一個名為copyTextToClipboard的 JavaScript 函數。該腳本提供了一種簡單而有效的與剪貼簿互動的方式:

<script>
    function copyTextToClipboard(text) {
        navigator.clipboard.writeText(text).then(function () {
            console.log('Copying to clipboard was successful!');
        }, function (err) {
            console.error('Could not copy text: ', err);
        });
    }
</script>
<script>
    function copyTextToClipboard(text) {
        navigator.clipboard.writeText(text).then(function () {
            console.log('Copying to clipboard was successful!');
        }, function (err) {
            console.error('Could not copy text: ', err);
        });
    }
</script>
HTML

該函數接受一個文字參數,該參數是要複製的文字。 它使用navigator.clipboard.writeText方法,這是一種與剪貼簿互動的現代方法。 該方法因其簡單易用且符合網路標準而備受青睞。 它旨在複製成功後在控制台中記錄成功訊息,以幫助調試並確保流暢的功能。 如果發生錯誤,錯誤訊息會記錄到控制台,從而提供有關操作過程中遇到的任何問題的見解。

index.razor 的@code部分中的CopyToClipboard方法充當 Blazor 應用程式和 JavaScript 函數之間的橋樑。 使用者介面中的按鈕點擊會觸發此方法。 啟動後,它會使用 Blazor 的 JavaScript 互通功能來呼叫copyTextToClipboard JavaScript 函數。 scannedText作為參數傳遞給此函數,從而有效地將文字複製到使用者的剪貼簿。

private async Task CopyToClipboard()
{
    await JSRuntime.InvokeVoidAsync("copyTextToClipboard", scannedText);
}
private async Task CopyToClipboard()
{
    await JSRuntime.InvokeVoidAsync("copyTextToClipboard", scannedText);
}
Private Async Function CopyToClipboard() As Task
	Await JSRuntime.InvokeVoidAsync("copyTextToClipboard", scannedText)
End Function
$vbLabelText   $csharpLabel

執行應用程式

專案運行後,用戶將看到以下簡潔明了的介面。 初始螢幕醒目地展示了二維碼掃描器模組。 此模組包含一個用於上傳二維碼圖像檔案的按鈕("選擇檔案"),以及另一個用於啟動掃描過程的按鈕("掃描二維碼")。 初始狀態下,未選擇任何文件,掃描區域為空白,等待使用者輸入。

如何建立 Blazor 二維碼掃描器:圖 6 - 專案初始執行結果

使用者使用"選擇檔案"按鈕選擇並上傳二維碼影像,此時會顯示所選檔案的名稱(例如,"qrvalue.png")。 上傳的二維碼會顯示在介面上的指定區域,向使用者確認影像已準備好進行掃描。

如何建立 Blazor 二維碼掃描器:圖 7 - 使用者輸入二維碼後的結果

用戶點擊"掃描二維碼"按鈕後,應用程式將處理影像。 如果掃描成功,二維碼中編碼的文字將顯示在圖像下方。 在這種情況下,掃描結果( &#39;<https://ironsoftware.com/csharp/qr/> &#39; ) 是一個 URL,指示使用 QR 閱讀器掃描 QR 碼時,使用者將被引導至何處。 結果旁邊會出現一個複製按鈕,方便使用者將掃描的文字複製到剪貼簿以供後續使用。

如何建立 Blazor 二維碼掃描器:圖 8 - 此圖顯示了二維碼中的文字和複製按鈕

結論

如何建立 Blazor 二維碼掃描器:圖 9

總而言之,將 IronQR 整合到 Blazor Server 應用程式的過程流暢有效,最終實現了二維碼掃描解決方案。 從專案設定開始到掃描功能的實現,反應迅速且易於使用,這得益於 IronQR 強大的處理能力與 Blazor 的動態 UI 渲染的結合。 從環境建構到部署,整個過程強調了這種整合在實際應用中的實用性和有效性。 雖然 IronQR 擅長處理二維碼,但對於需要掃描條碼功能的項目, IronBarcode是一個理想的選擇,它提供了類似的便利性和整合性。

IronQR 為開發者提供免費試用版,以便他們在購買前探索其各項功能。 如需在生產環境中擴展使用並存取其所有專業功能,IronQR 授權起價為$799 。

常見問題解答

如何將QR碼掃描器整合至Blazor應用程式?

若要在 Blazor 應用程式中整合 QR 掃描器,您可以使用 IronQR for .NET 函式庫。首先在 Visual Studio 中建立 Blazor 伺服器應用程式,透過 NuGet 套件管理員安裝 IronQR,並在 index.razor 檔案中建立使用者介面。使用 IronQR 實作檔案處理與掃描邏輯,掃描 QR 碼並顯示結果。

設定 Blazor 伺服器應用程式進行 QR 掃描的步驟為何?

若要設定 Blazor Server 應用程式進行 QR 掃描,請在 Visual Studio 中建立新的 Blazor Server 應用程式,透過 NuGet 套件管理員安裝 IronQR,在 index.razor 檔案中使用 HTML 和 CSS 設計使用者介面,並使用 IronQR 寫入掃描邏輯以處理 QR 碼影像。

IronQR 如何促進 Blazor 應用程式中的 QR 掃描?

IronQR 透過提供簡單易用的 QR 碼讀取與產生方法,促進 Blazor 應用程式中的 QR 碼掃描。它可與 .NET 應用程式無縫整合,讓您有效率地實作 QR 碼掃描邏輯,並在網頁介面上顯示掃描的資料。

IronQR 函式庫為 QR 碼處理提供哪些功能?

IronQR 函式庫提供讀取、解釋和產生 QR 碼的功能。它支援各種圖片格式,讓您輕鬆與需要 QR 碼掃描或產生的應用程式整合。該函式庫以其準確性和在 .NET 專案中的易用性而聞名。

我可以使用 IronQR 在 Blazor 應用程式中產生 QR 碼嗎?

是的,IronQR 可用於在 Blazor 應用程式中產生 QR 碼。您可以將它整合到您的應用程式中,從文字或 URL 建立 QR 碼,然後根據需要顯示或列印。

如何在 Blazor 中使用 IronQR 解決 QR 掃描問題?

若要排除 Blazor 中使用 IronQR 的 QR 碼掃描問題,請確保透過 NuGet Package Manager 正確安裝 IronQR 函式庫、驗證影像檔案格式是否受支援,並檢查應用程式中實作的掃描邏輯是否有任何錯誤。檢閱說明文件也可能提供額外的啟發。

QR code 應用程式使用 Blazor Server 有什麼優勢?

使用 Blazor Server 開發 QR 碼應用程式有多項優點,包括使用 C# 建立互動式網頁介面、透過 SignalR 連線在伺服器端處理使用者互動,以及與 IronQR 等程式庫無縫整合以增強 QR 碼功能。

如何在Blazor應用程式中顯示QR碼掃描結果?

在 Blazor 應用程式中,您可以使用 IronQR 讀取 QR 碼資料,然後將結果輸出到使用者介面,以顯示 QR 碼掃描結果。這可透過更新頁面上的文字元素或顯示區域,將掃描的資訊顯示出來。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担产品测测试,产品开发和研究的责任时,Jordi 为持续的产品改进增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。