# Blazor で IronBarcode を使用する
この操作方法記事には、Blazorプロジェクト内でIronBarcodeを統合するための詳細な手順が含まれています。 例として、Blazorアプリでユーザーのウェブカメラからキャプチャされたバーコード/QRをスキャンするためにIronBarcodeを使用します。
<div class="hsg-featured-snippet">
<h2>Blazorでバーコードスキャナーを使う方法</h2>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://www.nuget.org/packages/BarCode/">Blazor でバーコードをスキャンするための C# ライブラリをインストールする</a></li>
<li>Blazorサーバープロジェクトを作成し、新しいRazorコンポーネントを追加します</li>
<li>JavaScriptを使用してWebカメラを有効にする</li>
<li>画像をサーバーに送信するための<a href="#anchor-capture-the-image">画像キャプチャ</a>方法を設定します</li>
<li><a href="#anchor-ironbarcode-extracting-captured-image">BarcodeReader.Read</a>メソッドを使用してバーコードをデコードする</li>
</ol>
</div>
## Blazorプロジェクトを作成
Visual Studioを開く => 新しいプロジェクトを作成 => Blazorサーバーアプリ:

プロジェクト名と場所を設定:

**.NET 6**フレームワーク(または他の最新の標準.NETバージョン)を選択:

そして準備完了です:

ウェブカメラサポートを追加するには、新しいRazorコンポーネントを追加:

名前をつけて、_Add_をクリック:

## JavaScriptでウェブカメラ機能を有効にする
このアプリはユーザーのウェブカメラを使用するため、プライバシーのためにクライアント側で処理を行う必要があります。 プロジェクトにJavaScriptファイルを追加してウェブカメラ機能を処理し、`webcam.js`と名付けます:

`webcam.js`の参照を含めるのを忘れないでください:
```html
<script src="webcam.js"></script>
```
`webcam.js`に次のコードを追加します:
```javascript
// Current video stream
let videoStream;
// Function to initialize camera access and stream it to a video element
async function initializeCamera() {
const canvas = document.querySelector("#canvas");
const video = document.querySelector("#video");
// Check if navigator supports media devices
if (!("mediaDevices" in navigator) || !("getUserMedia" in navigator.mediaDevices)) {
alert("Camera API is not available in your browser");
return;
}
// Define video constraints
const constraints = {
video: {
width: { min: 180 },
height: { min: 120 }
},
};
// Set camera facing mode: "user" for front camera, "environment" for back camera
constraints.video.facingMode = useFrontCamera ? "user" : "environment";
try {
// Request camera access
videoStream = await navigator.mediaDevices.getUserMedia(constraints);
video.srcObject = videoStream;
} catch (err) {
alert("Could not access the camera: " + err);
}
}
```
ユーザーのウェブカメラを開く必要があります。 ページが読み込まれるときにこれを実行するため、`OnInitializedAsync()`メソッドをオーバーライドしてください。 前に書いたJavaScriptの`initializeCamera()`関数を呼び出します。
```csharp
protected override async Task OnInitializedAsync()
{
await JSRuntime.InvokeVoidAsync("initializeCamera");
}
```
次に、ウェブカメラのビデオストリームを実行するHTMLタグを追加します:
```html
<section class="section">
<video autoplay id="video" width="320"></video>
</section>
```
## 画像をキャプチャ
ウェブカメラのビデオフィードからフレームをキャプチャするために、`webcam.js`で別 for JavaScript関数を書きましょう。 この関数はソースビデオからキャンバスに現在のフレームを描画します。
```javascript
// Function to capture a frame from the video and send it to the server via Blazor
function getFrame(dotNetHelper) {
// Set canvas dimensions to match video
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
// Draw the current video frame onto the canvas
canvas.getContext('2d').drawImage(video, 0, 0);
// Convert the canvas content to a base64 encoded PNG image
let dataUrl = canvas.toDataURL("image/png");
// Send the image data to the C# method `ProcessImage`
dotNetHelper.invokeMethodAsync('ProcessImage', dataUrl);
}
```
この関数はフレームをキャプチャし、それをbase64にエンコードしてから、`ProcessImage()`と呼ばれるC#のメソッドにエンコードされた画像を送信します。 `ProcessImage()`メソッドは次のとおりです: エンコードされた画像をサーバーサイドのAPIに送信して処理します。
```csharp
[JSInvokable]
public async Task ProcessImage(string imageString)
{
// Create an image object containing the base64 data
var imageObject = new CamImage();
imageObject.imageDataBase64 = imageString;
// Serialize image object to JSON
var jsonObj = System.Text.Json.JsonSerializer.Serialize(imageObject);
// Send image data to server-side API for processing
var barcodeeResult = await Http.PostAsJsonAsync("Ironsoftware/ReadBarCode", imageObject);
if (barcodeeResult.StatusCode == System.Net.HttpStatusCode.OK)
{
QRCodeResult = await barcodeeResult.Content.ReadAsStringAsync();
StateHasChanged();
}
}
```
JavaScriptの`getFrame()`からサーバーサイドのAPIにエンコードされた画像を送信して処理します。
次に、こ for JavaScript関数を**フレームをキャプチャ**ボタンがクリックされたときに呼び出す必要があります。 我々のボタンは、`CaptureFrame`というハンドラー関数を探していることを忘れないでください。
```csharp
private async Task CaptureFrame()
{
await JSRuntime.InvokeAsync<String>("getFrame", DotNetObjectReference.Create(this));
}
```
## IronBarcodeでキャプチャした画像を抽出
サーバープロジェクトにIronBarcode NuGetパッケージを追加します:
```shell
:InstallCmd dotnet add package IronBarCode
```
次に、サーバープロジェクトでAPIメソッドを追加し、エンコードされた画像を処理し、バーコード/QR値を抽出します。 以下のコードはBlazorプロジェクトにバーコード読み取り機能を追加します。 スキャンした画像から、画像の前処理を行い、`FromStream`メソッドに入力します。 **Image**オブジェクトを、Blazorでバーコードをスキャンするために`BarcodeReader`クラス内のメソッドに渡します。 **BarcodeResult**オブジェクトの*Value*プロパティから結果のバーコード値にアクセスできます。
```csharp
[HttpPost]
[Route("ReadBarCode")]
public string ReadBarCode(CamImage imageData)
{
try
{
// Decode the base64 image data
var splitObject = imageData.imageDataBase64.Split(',');
byte[] imagebyteData = Convert.FromBase64String((splitObject.Length > 1) ? splitObject[1] : splitObject[0]);
// Set IronBarcode license key (replace 'Key' with actual key)
IronBarCode.License.LicenseKey = "Key";
using (var ms = new MemoryStream(imagebyteData))
{
// Convert byte array to Image
Image barcodeImage = Image.FromStream(ms);
// Read barcode from Image
var result = BarcodeReader.Read(barcodeImage);
if (result == null || result.Value == null)
{
return $"{DateTime.Now}: Barcode is Not Detected";
}
return $"{DateTime.Now}: Barcode is ({result.Value})";
}
}
catch (Exception ex)
{
return $"Exception: {ex.Message}";
}
}
// Model to encapsulate the base64 image data
public class CamImage
{
public string imageDataBase64 { get; set; }
}
```
サンプルプロジェクトは[ここ](/static-assets/barcode/faq/blazor/BlazorIronBarcodeWithCAM.zip)で見つけることができます。
// Current video streamlet videoStream;// Function to initialize camera access and stream it to a video elementasync function initializeCamera() { const canvas = document.querySelector("#canvas"); const video = document.querySelector("#video"); // Check if navigator supports media devices if (!("mediaDevices" in navigator) || !("getUserMedia" in navigator.mediaDevices)) { alert("Camera API is not available in your browser"); return; } // Define video constraints const constraints = { video: { width: { min: 180 }, height: { min: 120 } }, }; // Set camera facing mode: "user" for front camera, "environment" for back camera constraints.video.facingMode = useFrontCamera ? "user" : "environment"; try { // Request camera access videoStream = await navigator.mediaDevices.getUserMedia(constraints); video.srcObject = videoStream; } catch (err) { alert("Could not access the camera: " + err); }}
// Current video stream
let videoStream;
// Function to initialize camera access and stream it to a video element
async function initializeCamera() {
const canvas = document.querySelector("#canvas");
const video = document.querySelector("#video");
// Check if navigator supports media devices
if (!("mediaDevices" in navigator) || !("getUserMedia" in navigator.mediaDevices)) {
alert("Camera API is not available in your browser");
return;
}
// Define video constraints
const constraints = {
video: {
width: { min: 180 },
height: { min: 120 }
},
};
// Set camera facing mode: "user" for front camera, "environment" for back camera
constraints.video.facingMode = useFrontCamera ? "user" : "environment";
try {
// Request camera access
videoStream = await navigator.mediaDevices.getUserMedia(constraints);
video.srcObject = videoStream;
} catch (err) {
alert("Could not access the camera: " + err);
}
}
ウェブカメラのビデオフィードからフレームをキャプチャするために、webcam.jsで別 for JavaScript関数を書きましょう。 この関数はソースビデオからキャンバスに現在のフレームを描画します。
// Function to capture a frame from the video and send it to the server via Blazorfunction getFrame(dotNetHelper) { // Set canvas dimensions to match video canvas.width = video.videoWidth; canvas.height = video.videoHeight; // Draw the current video frame onto the canvas canvas.getContext('2d').drawImage(video, 0, 0); // Convert the canvas content to a base64 encoded PNG image let dataUrl = canvas.toDataURL("image/png"); // Send the image data to the C# method `ProcessImage` dotNetHelper.invokeMethodAsync('ProcessImage', dataUrl);}
// Function to capture a frame from the video and send it to the server via Blazor
function getFrame(dotNetHelper) {
// Set canvas dimensions to match video
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
// Draw the current video frame onto the canvas
canvas.getContext('2d').drawImage(video, 0, 0);
// Convert the canvas content to a base64 encoded PNG image
let dataUrl = canvas.toDataURL("image/png");
// Send the image data to the C# method `ProcessImage`
dotNetHelper.invokeMethodAsync('ProcessImage', dataUrl);
}
[JSInvokable]public async TaskProcessImage(string imageString){ // Create an image object containing the base64 data var imageObject = new CamImage(); imageObject.imageDataBase64 = imageString; // Serialize image object to JSON var jsonObj = System.Text.Json.JsonSerializer.Serialize(imageObject); // Send image data to server-side API for processing var barcodeeResult = awaitHttp.PostAsJsonAsync("Ironsoftware/ReadBarCode", imageObject); if (barcodeeResult.StatusCode == System.Net.HttpStatusCode.OK) {QRCodeResult = await barcodeeResult.Content.ReadAsStringAsync();StateHasChanged(); }}
[JSInvokable]
public async Task ProcessImage(string imageString)
{
// Create an image object containing the base64 data
var imageObject = new CamImage();
imageObject.imageDataBase64 = imageString;
// Serialize image object to JSON
var jsonObj = System.Text.Json.JsonSerializer.Serialize(imageObject);
// Send image data to server-side API for processing
var barcodeeResult = await Http.PostAsJsonAsync("Ironsoftware/ReadBarCode", imageObject);
if (barcodeeResult.StatusCode == System.Net.HttpStatusCode.OK)
{
QRCodeResult = await barcodeeResult.Content.ReadAsStringAsync();
StateHasChanged();
}
}
<JSInvokable>PublicAsync Function ProcessImage(imageString AsString) AsTask ' Create an image object containing the base64 data Dim imageObject As New CamImage() imageObject.imageDataBase64 = imageString ' Serialize image object to JSON Dim jsonObj = System.Text.Json.JsonSerializer.Serialize(imageObject) ' Send image data to server-side API for processing Dim barcodeeResult = AwaitHttp.PostAsJsonAsync("Ironsoftware/ReadBarCode", imageObject) If barcodeeResult.StatusCode = System.Net.HttpStatusCode.OKThenQRCodeResult = Await barcodeeResult.Content.ReadAsStringAsync()StateHasChanged() End IfEnd Function
<JSInvokable>
Public Async Function ProcessImage(imageString As String) As Task
' Create an image object containing the base64 data
Dim imageObject As New CamImage()
imageObject.imageDataBase64 = imageString
' Serialize image object to JSON
Dim jsonObj = System.Text.Json.JsonSerializer.Serialize(imageObject)
' Send image data to server-side API for processing
Dim barcodeeResult = Await Http.PostAsJsonAsync("Ironsoftware/ReadBarCode", imageObject)
If barcodeeResult.StatusCode = System.Net.HttpStatusCode.OK Then
QRCodeResult = Await barcodeeResult.Content.ReadAsStringAsync()
StateHasChanged()
End If
End Function
[HttpPost][Route("ReadBarCode")]public stringReadBarCode(CamImage imageData){ try { // Decode the base64 image data var splitObject = imageData.imageDataBase64.Split(','); byte[] imagebyteData = Convert.FromBase64String((splitObject.Length > 1) ? splitObject[1] : splitObject[0]); // Set IronBarcode license key (replace 'Key' with actual key)IronBarCode.License.LicenseKey = "Key"; using (var ms = new MemoryStream(imagebyteData)) { // Convert byte array to Image Image barcodeImage = Image.FromStream(ms); // Read barcode from Image var result = BarcodeReader.Read(barcodeImage); if (result == null || result.Value == null) { return $"{DateTime.Now}: Barcode is Not Detected"; } return $"{DateTime.Now}: Barcode is ({result.Value})"; } } catch (Exception ex) { return $"Exception: {ex.Message}"; }}// Model to encapsulate the base64 image datapublic class CamImage{ public string imageDataBase64 { get; set; }}
[HttpPost]
[Route("ReadBarCode")]
public string ReadBarCode(CamImage imageData)
{
try
{
// Decode the base64 image data
var splitObject = imageData.imageDataBase64.Split(',');
byte[] imagebyteData = Convert.FromBase64String((splitObject.Length > 1) ? splitObject[1] : splitObject[0]);
// Set IronBarcode license key (replace 'Key' with actual key)
IronBarCode.License.LicenseKey = "Key";
using (var ms = new MemoryStream(imagebyteData))
{
// Convert byte array to Image
Image barcodeImage = Image.FromStream(ms);
// Read barcode from Image
var result = BarcodeReader.Read(barcodeImage);
if (result == null || result.Value == null)
{
return $"{DateTime.Now}: Barcode is Not Detected";
}
return $"{DateTime.Now}: Barcode is ({result.Value})";
}
}
catch (Exception ex)
{
return $"Exception: {ex.Message}";
}
}
// Model to encapsulate the base64 image data
public class CamImage
{
public string imageDataBase64 { get; set; }
}
<HttpPost><Route("ReadBarCode")>Public Function ReadBarCode(ByVal imageData AsCamImage) AsStringTry ' Decode the base64 image data Dim splitObject = imageData.imageDataBase64.Split(","c) Dim imagebyteData() AsByte = Convert.FromBase64String(If(splitObject.Length > 1, splitObject(1), splitObject(0))) ' Set IronBarcode license key (replace 'Key' with actual key)IronBarCode.License.LicenseKey = "Key"Using ms = New MemoryStream(imagebyteData) ' Convert byte array to Image Dim barcodeImage AsImage = Image.FromStream(ms) ' Read barcode from Image Dim result = BarcodeReader.Read(barcodeImage) If result Is NothingOrElse result.ValueIs Nothing Then Return $"{DateTime.Now}: Barcode is Not Detected" End If Return $"{DateTime.Now}: Barcode is ({result.Value})"EndUsingCatch ex AsException Return $"Exception: {ex.Message}"EndTryEnd Function' Model to encapsulate the base64 image dataPublic Class CamImage Public Property imageDataBase64() AsStringEnd Class
<HttpPost>
<Route("ReadBarCode")>
Public Function ReadBarCode(ByVal imageData As CamImage) As String
Try
' Decode the base64 image data
Dim splitObject = imageData.imageDataBase64.Split(","c)
Dim imagebyteData() As Byte = Convert.FromBase64String(If(splitObject.Length > 1, splitObject(1), splitObject(0)))
' Set IronBarcode license key (replace 'Key' with actual key)
IronBarCode.License.LicenseKey = "Key"
Using ms = New MemoryStream(imagebyteData)
' Convert byte array to Image
Dim barcodeImage As Image = Image.FromStream(ms)
' Read barcode from Image
Dim result = BarcodeReader.Read(barcodeImage)
If result Is Nothing OrElse result.Value Is Nothing Then
Return $"{DateTime.Now}: Barcode is Not Detected"
End If
Return $"{DateTime.Now}: Barcode is ({result.Value})"
End Using
Catch ex As Exception
Return $"Exception: {ex.Message}"
End Try
End Function
' Model to encapsulate the base64 image data
Public Class CamImage
Public Property imageDataBase64() As String
End Class