AWS Lambda でバーコードを生成および認識します

ブログ カテゴリ: バーコード.NET

2020/05/22

AWS Lambda は、Amazon Web Services の一部として Amazon が提供するイベント駆動型のサーバーレス コンピューティング プラットフォームです。

このチュートリアルでは、Visual Studio .NET 2017 で AWS Lambda プロジェクトを作成し、DataMatrix バーコード イメージを生成して、AWS Lambda 関数で生成されたイメージ内の DataMatrix バーコードを認識する方法を説明します。

まず、Visual Studio 2017 を開いて新しい AWS Lambda プロジェクトを作成する必要があります。
Create AWS Lambda project in Visual Studio

次に、AWS Lambda 関数のコンテンツとして単純な SQS 関数を使用するように指定する必要があります。
Use simple SQS function as content for AWS Lambda function in Visual Studio

以下は Visual Studio 2017 で作成された AWS Lambda プロジェクトです。
AWS Lambda project in Visual Studio



次に、.NET Core の System.Drawing.Common nuget パッケージと Vintasoft.Barcode.dll への参照を追加する必要があります。
System.Drawing.Common は Vintasoft.Barcode アセンブリに必要です。 Vintasoft。バーコードの生成と認識にはバーコードアセンブリが必要です。
Add Vintasoft.Barcode.dll to AWS Lambda project in Visual Studio



次に、AWS Lambda 関数のコードを開く必要があります。
Open code of AWS Lambda function in Visual Studio

次に、AWS Lambda 関数にバーコードの生成と認識のためのコードを追加する必要があります。
C# code for barcode generation and recognition using AWS Lambda function

これは、DataMatrix バーコードを含む画像を生成し、生成された画像内のバーコードを認識できる AWS Lambda 関数の C# コードです。
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: Amazon.Lambda.Core.LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda1
{
    public class Function
    {

        /// <summary>
        /// Default constructor. This constructor is used by Lambda to construct the instance. When invoked in a Lambda environment
        /// the AWS credentials will come from the IAM role associated with the function and the AWS region will be set to the
        /// region the Lambda function is executed in.
        /// </summary>
        public Function()
        {
        }



        /// <summary>
        /// This method is called for every Lambda invocation. This method takes in an SQS event object and can be used
        /// to respond to SQS messages.
        /// </summary>
        public async System.Threading.Tasks.Task FunctionHandler(Amazon.Lambda.SQSEvents.SQSEvent evnt, Amazon.Lambda.Core.ILambdaContext context)
        {
            foreach (var message in evnt.Records)
            {
                await ProcessMessageAsync(message, context);
            }
        }

        private async System.Threading.Tasks.Task ProcessMessageAsync(Amazon.Lambda.SQSEvents.SQSEvent.SQSMessage message, Amazon.Lambda.Core.ILambdaContext context)
        {
            context.Logger.LogLine($"Processed message {message.Body}");

            try
            {
                // create memory stream, where image with barcode will be stored
                using (System.IO.MemoryStream mem = new System.IO.MemoryStream())
                {
                    // create the barcode writer
                    Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();
                    // specify that DataMatrix barcode must be created
                    barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.DataMatrix;
                    // specify the barcode value
                    barcodeWriter.Settings.Value = "1234567890987654321";
                    // generate barcode image and save to the memory stream as PNG file
                    barcodeWriter.SaveBarcodeAsImage(mem, Vintasoft.Barcode.BarcodeImageFormat.Png);

                    // create the barcode reader
                    using (Vintasoft.Barcode.BarcodeReader barcodeReader = new Vintasoft.Barcode.BarcodeReader())
                    {
                        // specify that reader must search for DataMatrix barcodes
                        barcodeReader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.DataMatrix;
                        // specify that reader must search horizontal barcodes only
                        barcodeReader.Settings.ScanDirection = Vintasoft.Barcode.ScanDirection.Horizontal;

                        // read barcodes from image
                        Vintasoft.Barcode.IBarcodeInfo[] infos = barcodeReader.ReadBarcodes(mem);

                        // if barcodes are not detected
                        if (infos.Length == 0)
                        {
                            context.Logger.LogLine($"No barcodes found.");
                        }
                        // if barcodes are detected
                        else
                        {
                            // get information about searched barcodes

                            for (int i = 0; i &lt; infos.Length; i++)
                            {
                                Vintasoft.Barcode.IBarcodeInfo info = infos[i];
                                context.Logger.LogLine(string.Format("Barcode: Type={0}, Value={1}", info.BarcodeType, info.Value));
                            }
                        }
                    }
                }
            }
            catch (System.Exception ex)
            {
                context.Logger.LogLine(string.Format("Error: {0}", ex.Message));
            }

            await System.Threading.Tasks.Task.CompletedTask;
        }
    }
}



最後に、AWS .NET Mock Lambda テストツールで AWS Lambda 関数を実行する必要があります。
Run AWS Lambda function in AWS .NET Mock Lambda Test Tool

AWS Lambda 関数に SQS リクエストを送信します。
Send a SQS request to our AWS Lambda function

AWS Lambda 関数を使用してバーコード認識の結果を確認します。
Result of barcode recognition using AWS Lambda function