跳至页脚内容
USING IRONBARCODE

如何在.NET中构建条形码阅读器SDK?

IronBarcode 允许 .NET 开发人员以最少的代码向其应用程序添加条形码读取功能。 它支持多种格式,包括一维和二维条形码、各种图像源,并利用基于机器学习的检测技术,为生产环境提供高精度。

条形码扫描对于许多应用至关重要,从库存管理到零售和物流。 通过将条形码读取功能集成到 .NET 应用程序中,您可以简化数据采集、自动化工作流程并提高效率。 在评估条形码阅读器解决方案时,请考虑支持的格式、处理速度和集成复杂性等因素。 IronBarcode 库提供完全的跨平台兼容性和卓越的容错功能。

IronBarcode 是一个高效的 .NET 库,可以简化条形码的使用。 借助此工具,您可以读取图像PDF 文件中的条形码,还可以使用C# QR 码生成器生成 QR 码。 本文将向您展示如何将条形码扫描集成到您的 .NET 应用程序中,重点介绍如何创建 API 或 Web 应用程序集成来公开条形码扫描功能。 该库支持各种条形码格式,包括一维和二维条形码,并具有高级生成功能样式选项

IronBarcode集成的最佳应用场景有哪些?

IronBarcode 在以下情况下表现出色:

*库存管理系统*– 支持多条形码读取多页 TIFF/GIF,实现产品跟踪自动化 物流应用– 使用高速读取和可自定义输出格式处理运输条形码 零售POS系统– 使用Code 39一维条形码生成验证交易 文档处理– 使用自定义阅读器设置PDF 发票中提取数据 医疗保健应用– 使用二维格式读取患者 ID 并进行错误纠正 生产质量控制**– 运行带有可配置条形码边距的批量处理

如何在.NET中创建条形码读取器SDK?

要创建可作为服务在应用程序中提供的条形码阅读器,请将 IronBarcode 集成到 REST API 或 Web 应用程序中。架构选择取决于您的处理需求:单张图像处理适用于偶尔扫描,批量处理适用于文档工作流程,流处理适用于连续扫描应用程序。 以下是一个使用 ASP.NET Core 并充分考虑线程安全的示例。 该图书馆的阅读功能包括先进的图像创建过滤器,以实现最佳精度。

  1. 使用NuGet 包安装用于在 C# 中读取条形码的 .NET 库
  2. 创建一个可重用的条形码扫描类,并具备完善的错误处理机制。
  3. 开发从不同来源读取条形码的方法
  4. 使用改进设置将条形码图像读取功能集成到您的应用程序中
  5. 通过阅读速度选项测试和改进性能

开始之前我需要准备什么?

如果您还没有下载 IronBarcode,请立即下载到您的项目中。 请确保您拥有适用于您预期用途的正确许可证密钥。 请注意,通过公共 API 公开 IronBarcode 的功能或将其作为独立服务转售需要额外的许可(SDK、OEM 或 SaaS)。 请务必在继续操作前了解许可选项。 对于开发环境,您可以先使用免费试用版,然后在准备好投入生产环境时应用您的许可证密钥。 查看变更日志以获取最新更新和里程碑信息

为了获得最佳性能,请考虑您的部署环境。 IronBarcode 支持跨平台兼容性,包括WindowsLinuxmacOSDocker以及AzureAWS Lambda等云平台。 移动开发者可以通过Blazor 集成获得对AndroidiOS 的支持。 对于 .NET MAUI 应用程序,请按照条形码扫描器阅读器教程进行操作。

如何创建条形码扫描器类?

在设置好 IronBarcode 并将其安装到项目中之后,您可以创建一个可重用的条形码扫描器类,该类集成了 IronBarcode 的功能并将其公开为 API 端点。 该实现方案包括性能优化和图像校正,以应对具有挑战性的场景,并进行方向校正。 如果条形码位置可预测,可以考虑实施作物区域划分以加快处理速度:

using IronBarCode;
using System.IO;
using System.Collections.Concurrent;
using System.Threading.Tasks;

namespace BarcodeIntegration
{
    public class BarcodeScanner
    {
        private static readonly ConcurrentDictionary<string, BarcodeReaderOptions> _optionsCache = new();

        static BarcodeScanner()
        {
            // Set the license key
            IronBarCode.License.LicenseKey = "Your-License-Key";
        }

        // Method to read a barcode from an image file with performance optimization
        public string ReadBarcodeFromImage(string imagePath, BarcodeReadingSpeed speed = BarcodeReadingSpeed.Balanced)
        {
            try
            {
                var options = GetCachedOptions(speed);
                // Try to read the barcode from the given image path
                var barcode = BarcodeReader.Read(imagePath, options);
                return barcode?.ToString() ?? "No Barcode Found"; // Return the barcode string or indicate no barcode was found
            }
            catch (Exception ex)
            {
                // Return an error message if an exception occurs
                return $"Error reading barcode: {ex.Message}";
            }
        }

        // Method to read a barcode from a stream (e.g., file upload or memory stream)
        public async Task<string> ReadBarcodeFromStreamAsync(Stream inputStream)
        {
            try
            {
                var options = GetCachedOptions(BarcodeReadingSpeed.Detailed);
                // Enable image correction for better accuracy
                options.ImageFilters = new[] { 
                    new SharpenFilter(), 
                    new ContrastFilter() 
                };

                // Try to read the barcode from the given stream
                var barcode = await Task.Run(() => BarcodeReader.Read(inputStream, options));
                return barcode?.ToString() ?? "No barcode found";
            }
            catch (Exception ex)
            {
                return $"Error reading barcode: {ex.Message}";
            }
        }

        // Method to read a barcode from a PDF file with batch processing support
        public async Task<List<string>> ReadBarcodesFromPdfAsync(string filePath)
        {
            try
            {
                var options = new BarcodeReaderOptions
                {
                    ExpectMultipleBarcodes = true,
                    Speed = BarcodeReadingSpeed.Detailed
                };

                // Try to read barcodes from the given PDF file path
                var barcodes = await Task.Run(() => BarcodeReader.ReadPdf(filePath, options));
                return barcodes.Select(b => b.ToString()).ToList();
            }
            catch (Exception ex)
            {
                return new List<string> { $"Error reading barcode: {ex.Message}" };
            }
        }

        // Cache reader options for performance
        private BarcodeReaderOptions GetCachedOptions(BarcodeReadingSpeed speed)
        {
            return _optionsCache.GetOrAdd(speed.ToString(), _ => new BarcodeReaderOptions
            {
                Speed = speed,
                AutoRotate = true,
                RemoveFalsePositive = true
            });
        }
    }
}
using IronBarCode;
using System.IO;
using System.Collections.Concurrent;
using System.Threading.Tasks;

namespace BarcodeIntegration
{
    public class BarcodeScanner
    {
        private static readonly ConcurrentDictionary<string, BarcodeReaderOptions> _optionsCache = new();

        static BarcodeScanner()
        {
            // Set the license key
            IronBarCode.License.LicenseKey = "Your-License-Key";
        }

        // Method to read a barcode from an image file with performance optimization
        public string ReadBarcodeFromImage(string imagePath, BarcodeReadingSpeed speed = BarcodeReadingSpeed.Balanced)
        {
            try
            {
                var options = GetCachedOptions(speed);
                // Try to read the barcode from the given image path
                var barcode = BarcodeReader.Read(imagePath, options);
                return barcode?.ToString() ?? "No Barcode Found"; // Return the barcode string or indicate no barcode was found
            }
            catch (Exception ex)
            {
                // Return an error message if an exception occurs
                return $"Error reading barcode: {ex.Message}";
            }
        }

        // Method to read a barcode from a stream (e.g., file upload or memory stream)
        public async Task<string> ReadBarcodeFromStreamAsync(Stream inputStream)
        {
            try
            {
                var options = GetCachedOptions(BarcodeReadingSpeed.Detailed);
                // Enable image correction for better accuracy
                options.ImageFilters = new[] { 
                    new SharpenFilter(), 
                    new ContrastFilter() 
                };

                // Try to read the barcode from the given stream
                var barcode = await Task.Run(() => BarcodeReader.Read(inputStream, options));
                return barcode?.ToString() ?? "No barcode found";
            }
            catch (Exception ex)
            {
                return $"Error reading barcode: {ex.Message}";
            }
        }

        // Method to read a barcode from a PDF file with batch processing support
        public async Task<List<string>> ReadBarcodesFromPdfAsync(string filePath)
        {
            try
            {
                var options = new BarcodeReaderOptions
                {
                    ExpectMultipleBarcodes = true,
                    Speed = BarcodeReadingSpeed.Detailed
                };

                // Try to read barcodes from the given PDF file path
                var barcodes = await Task.Run(() => BarcodeReader.ReadPdf(filePath, options));
                return barcodes.Select(b => b.ToString()).ToList();
            }
            catch (Exception ex)
            {
                return new List<string> { $"Error reading barcode: {ex.Message}" };
            }
        }

        // Cache reader options for performance
        private BarcodeReaderOptions GetCachedOptions(BarcodeReadingSpeed speed)
        {
            return _optionsCache.GetOrAdd(speed.ToString(), _ => new BarcodeReaderOptions
            {
                Speed = speed,
                AutoRotate = true,
                RemoveFalsePositive = true
            });
        }
    }
}
$vbLabelText   $csharpLabel

改进后的BarcodeScanner类通过选项缓存、 异步处理(以提高可扩展性)和图像过滤器(以提高准确性)进行了性能优化。 该实现遵循 SOLID 原则,并提供可用于生产环境的错误处理。 如需更多功能,请考虑使用System.Drawing 集成导出为流。 您还可以创建具有自定义条形码样式二维码样式的条形码图像

读取不同来源的条形码应该使用哪些方法?

每种方法都针对特定用例和处理要求进行了改进:

  • ReadBarcodeFromImage(string imagePath) :从图像文件中读取条形码。
  • ReadBarcodeFromStream(Stream inputStream) :从输入流(例如,文件上传或内存流)读取条形码。
  • ReadBarcodeFromPdf(string filePath) :从 PDF 文件中读取条形码。

对于大批量生产场景,如果条形码位置可预测,可以考虑使用作物区域来提高处理速度,最高可达 5 倍。 您还可以创建条形码图像或以各种格式保存条形码。 该库支持从 System.Drawing 对象读取数据,并可将条形码导出为 HTMLPDF 文档

如何通过 REST API 公开条形码读取功能?

要允许外部应用程序使用您的条形码扫描功能,请使用 ASP.NET Core 将其公开为 REST API。 该实现方案包括适当的错误处理、验证以及对多种输入格式的支持。 您还可以使用C# 条形码图像生成器生成条形码,或探索条形码快速入门示例。 处理 PDF 文件时,可考虑在现有 PDF 文件上添加条形码以进行文档跟踪:

using Microsoft.AspNetCore.Mvc;
using System.IO;
using Microsoft.AspNetCore.Http;
using BarcodeIntegration;

[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
    private readonly BarcodeScanner _barcodeScanner;
    private readonly ILogger<BarcodeController> _logger;

    public BarcodeController(ILogger<BarcodeController> logger)
    {
        _barcodeScanner = new BarcodeScanner();
        _logger = logger;
    }

    // POST endpoint to read barcode from an uploaded image
    [HttpPost("read-from-image")]
    public async Task<IActionResult> ReadFromImage(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest(new { Error = "No file uploaded" });

        // Validate file type
        var allowedTypes = new[] { "image/jpeg", "image/png", "image/gif", "image/bmp", "image/tiff" };
        if (!allowedTypes.Contains(file.ContentType.ToLower()))
            return BadRequest(new { Error = "Unsupported file type" });

        try
        {
            using var stream = file.OpenReadStream();
            var result = await _barcodeScanner.ReadBarcodeFromStreamAsync(stream);

            _logger.LogInformation($"Barcode read successfully from {file.FileName}");
            return Ok(new { Barcode = result, FileName = file.FileName });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error processing barcode");
            return StatusCode(500, new { Error = "Internal server error" });
        }
    }

    // POST endpoint for batch processing
    [HttpPost("read-batch")]
    public async Task<IActionResult> ReadBatch(List<IFormFile> files)
    {
        var results = new List<object>();

        foreach (var file in files)
        {
            using var stream = file.OpenReadStream();
            var result = await _barcodeScanner.ReadBarcodeFromStreamAsync(stream);
            results.Add(new { FileName = file.FileName, Barcode = result });
        }

        return Ok(new { Results = results, Count = results.Count });
    }

    // POST endpoint to generate barcode from data
    [HttpPost("generate")]
    public IActionResult GenerateBarcode([FromBody] BarcodeGenerationRequest request)
    {
        try
        {
            // Create barcode with specified data and format
            var barcode = BarcodeWriter.CreateBarcode(request.Data, request.Format ?? BarcodeWriterEncoding.Code128);

            // Apply custom styling if requested
            if (request.Width.HasValue && request.Height.HasValue)
                barcode.ResizeTo(request.Width.Value, request.Height.Value);

            if (!string.IsNullOrEmpty(request.ForegroundColor))
                barcode.ChangeBarCodeColor(System.Drawing.ColorTranslator.FromHtml(request.ForegroundColor));

            // Return as base64 encoded image
            using var ms = barcode.ToStream();
            var bytes = ms.ToArray();
            return Ok(new { 
                Image = Convert.ToBase64String(bytes),
                Format = request.Format?.ToString() ?? "Code128",
                Data = request.Data 
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating barcode");
            return BadRequest(new { Error = "Failed to generate barcode" });
        }
    }
}

public class BarcodeGenerationRequest
{
    public string Data { get; set; }
    public BarcodeWriterEncoding? Format { get; set; }
    public int? Width { get; set; }
    public int? Height { get; set; }
    public string ForegroundColor { get; set; }
}
using Microsoft.AspNetCore.Mvc;
using System.IO;
using Microsoft.AspNetCore.Http;
using BarcodeIntegration;

[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
    private readonly BarcodeScanner _barcodeScanner;
    private readonly ILogger<BarcodeController> _logger;

    public BarcodeController(ILogger<BarcodeController> logger)
    {
        _barcodeScanner = new BarcodeScanner();
        _logger = logger;
    }

    // POST endpoint to read barcode from an uploaded image
    [HttpPost("read-from-image")]
    public async Task<IActionResult> ReadFromImage(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest(new { Error = "No file uploaded" });

        // Validate file type
        var allowedTypes = new[] { "image/jpeg", "image/png", "image/gif", "image/bmp", "image/tiff" };
        if (!allowedTypes.Contains(file.ContentType.ToLower()))
            return BadRequest(new { Error = "Unsupported file type" });

        try
        {
            using var stream = file.OpenReadStream();
            var result = await _barcodeScanner.ReadBarcodeFromStreamAsync(stream);

            _logger.LogInformation($"Barcode read successfully from {file.FileName}");
            return Ok(new { Barcode = result, FileName = file.FileName });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error processing barcode");
            return StatusCode(500, new { Error = "Internal server error" });
        }
    }

    // POST endpoint for batch processing
    [HttpPost("read-batch")]
    public async Task<IActionResult> ReadBatch(List<IFormFile> files)
    {
        var results = new List<object>();

        foreach (var file in files)
        {
            using var stream = file.OpenReadStream();
            var result = await _barcodeScanner.ReadBarcodeFromStreamAsync(stream);
            results.Add(new { FileName = file.FileName, Barcode = result });
        }

        return Ok(new { Results = results, Count = results.Count });
    }

    // POST endpoint to generate barcode from data
    [HttpPost("generate")]
    public IActionResult GenerateBarcode([FromBody] BarcodeGenerationRequest request)
    {
        try
        {
            // Create barcode with specified data and format
            var barcode = BarcodeWriter.CreateBarcode(request.Data, request.Format ?? BarcodeWriterEncoding.Code128);

            // Apply custom styling if requested
            if (request.Width.HasValue && request.Height.HasValue)
                barcode.ResizeTo(request.Width.Value, request.Height.Value);

            if (!string.IsNullOrEmpty(request.ForegroundColor))
                barcode.ChangeBarCodeColor(System.Drawing.ColorTranslator.FromHtml(request.ForegroundColor));

            // Return as base64 encoded image
            using var ms = barcode.ToStream();
            var bytes = ms.ToArray();
            return Ok(new { 
                Image = Convert.ToBase64String(bytes),
                Format = request.Format?.ToString() ?? "Code128",
                Data = request.Data 
            });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating barcode");
            return BadRequest(new { Error = "Failed to generate barcode" });
        }
    }
}

public class BarcodeGenerationRequest
{
    public string Data { get; set; }
    public BarcodeWriterEncoding? Format { get; set; }
    public int? Width { get; set; }
    public int? Height { get; set; }
    public string ForegroundColor { get; set; }
}
$vbLabelText   $csharpLabel

在 Swagger UI 中,API 的显示效果如何?

Swagger UI 展示了 BarcoderScannerSDK API,它包含两个 POST 端点,分别用于从图像和 PDF 中读取条形码,并提供文件上传界面和请求配置选项。

API响应是什么样的?

API 文档显示,向条形码读取端点成功发送 POST 请求,返回"Hello World!"以及 200 OK 响应状态。

此 API 公开 POST 端点,您可以在其中上传条形码图像,API 将返回条形码数据。 该实现方案包括适当的验证、错误处理和日志记录,以满足生产环境的需求。 对于移动应用程序,可以考虑添加针对更小图像尺寸和更快响应时间进行改进的端点。 您还可以从数据创建条形码,或将其导出为HTMLPDF 。 对于高对比度要求,生成1-BPP 条形码图像。## 我可以添加哪些高级功能?

为了进一步改进您的 SDK,请考虑使用 IronBarcode 的完整API 参考来实现这些可用于生产环境的功能。 浏览功能概述并查看演示以了解实际应用:

如何支持多种条形码类型?

IronBarcode支持同时读取多个条形码。 您可以配置 SDK,使其能够一次接受多个条形码,并进行特定的格式筛选。 该库支持编写包含中文和阿拉伯字符的Unicode条形码。 对于特殊应用,可以探索Code 39 读取功能创建具有自定义样式的二维码

public async Task<List<BarcodeResult>> ReadMultipleBarcodesAsync(string imagePath, BarcodeEncoding[] expectedTypes = null)
{
    try
    {
        var options = new BarcodeReaderOptions()
        {
            ExpectMultipleBarcodes = true,
            ExpectBarcodeTypes = expectedTypes ?? BarcodeEncoding.All,
            Speed = BarcodeReadingSpeed.Detailed,
            MaxParallelThreads = Environment.ProcessorCount,
            Multithreaded = true
        };

        // Apply confidence threshold for machine learning accuracy
        options.Confidence = Confidence.High;

        var results = await Task.Run(() => BarcodeReader.Read(imagePath, options));

        return results.Select(barcode => new BarcodeResult
        {
            Value = barcode.ToString(),
            Format = barcode.BarcodeType.ToString(),
            Confidence = barcode.Confidence,
            Position = barcode.Rect
        }).ToList();
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error reading multiple barcodes");
        throw;
    }
}
public async Task<List<BarcodeResult>> ReadMultipleBarcodesAsync(string imagePath, BarcodeEncoding[] expectedTypes = null)
{
    try
    {
        var options = new BarcodeReaderOptions()
        {
            ExpectMultipleBarcodes = true,
            ExpectBarcodeTypes = expectedTypes ?? BarcodeEncoding.All,
            Speed = BarcodeReadingSpeed.Detailed,
            MaxParallelThreads = Environment.ProcessorCount,
            Multithreaded = true
        };

        // Apply confidence threshold for machine learning accuracy
        options.Confidence = Confidence.High;

        var results = await Task.Run(() => BarcodeReader.Read(imagePath, options));

        return results.Select(barcode => new BarcodeResult
        {
            Value = barcode.ToString(),
            Format = barcode.BarcodeType.ToString(),
            Confidence = barcode.Confidence,
            Position = barcode.Rect
        }).ToList();
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "Error reading multiple barcodes");
        throw;
    }
}
$vbLabelText   $csharpLabel

我还应该考虑哪些其他改进措施?

*错误处理:*实现完整的错误处理,包括MSI 条形码识别 批量处理:创建用于异步批量处理1-BPP 条形码图像的方法 性能监控:添加读取速度配置指标 缓存:对频繁扫描的条形码实施结果缓存 图像预处理:**使用方向校正对比度滤波器 *格式特定优化:配置GS1-128新格式的设置

对于生产环境部署,可以考虑实施置信度阈值,以减少误报并确保数据准确性。 基于机器学习的检测方法可以根据您的具体使用场景进行微调。 创建部署包时,请按照MSI 安装程序指南进行操作,并解决任何缺失的 DLL 问题。 对于 AWS 部署,请注意潜在的运行时问题。 考虑创建具有各种输出数据格式的条形码,并探索条形码读取教程

我应该注意哪些许可方面的注意事项?

如前所述,IronBarcode SDK是为了集成到您的内部应用程序中,通过API公开需要额外的许可。 在将 IronBarcode 作为服务的一部分(例如公共 API)公开之前,您必须获得必要的许可(SDK、OEM 或 SaaS)。 对于企业部署,请考虑使用可用的许可扩展来增加席位或改进支持。 查看升级选项,以扩展您的部署规模。

未经许可,请勿将 IronBarcode 作为独立 SDK 转售,或通过面向公众的 API 公开,除非您已确保您的许可涵盖此用途。 对于 Web 应用程序,您可能需要在 web.config 中配置许可证密钥才能正确激活。 随时了解安全 CVE 更新,并遵循运行时复制例外的最佳实践。 对于技术问题,请考虑提交工程请求。 查看有关编写 Unicode 条形码的资源,并探索读取条形码教程

我今天为什么要尝试 IronBarcode?

体验IronBarcode的全新功能。 试用我们的免费试用版,体验适用于 .NET 应用程序的流畅条形码生成、读取和编辑功能。 凭借高级功能、卓越的性能和用户友好的界面,IronBarcode是满足您所有条码需求的终极解决方案。 请浏览我们的完整文档、查看代码示例并观看实时演示,以了解其全部功能。 查看有关读取条形码的教程,并了解MicroQR 和 rMQR支持。 了解适用于不同部署场景的NuGet 包选项。 您还可以查阅IronBarcode 文档,了解有关我们完整条形码解决方案的更多信息。 立即开始免费试用,提升您的项目质量。

常见问题解答

如何将条码阅读器集成到 .NET 应用程序中?

您可以通过使用 IronBarcode 库将条码阅读器集成到 .NET 应用程序中。首先安装 IronBarcode,然后创建一个用于条码扫描的类,并实现从图像、流和 PDF 中读取条码的方法。最后测试和优化您的设置。

如何将条码读取功能公开为 REST API?

要公开条码读取功能为 REST API,使用 ASP.NET Core 创建一个 Web 应用程序。结合 IronBarcode 库,开发一个 BarcodeScanner 类,并定义使用诸如ReadBarcodeFromImageReadBarcodeFromStream等方法读取条码的 API 端点。

使用 .NET 条码库可以读取哪些类型的条码?

像 IronBarcode 这样的 .NET 条码库可以读取各种条码类型,包括 QR 码、Code 128、UPC 和 EAN。您可以通过设置检测参数来配置库同时检测多种条码类型。

如何在 .NET 中处理读取条码时的错误?

可以通过在使用 IronBarcode 的条码扫描方法中实现稳健的错误处理来处理条码读取中的错误。确保捕捉异常并提供有意义的反馈或重试机制,以提高条码读取过程的可靠性。

在公共 API 中使用 .NET 条码库的许可要求是什么?

在公共 API 中使用 IronBarcode 时,您必须确保正确的许可。这包括获取 SDK、OEM 或 SaaS 许可,因为将该库的功能作为独立服务或公共 API 公开需要额外的权限。

我能否使用 .NET 库批量处理多个条码扫描?

是的,您可以使用 IronBarcode 批量处理多个条码扫描。该库允许您在单次操作中读取多个条码,这对于高效地处理大量图像或文档集特别有用。

是否有可用 .NET 条码库的试用版?

是的,IronBarcode 提供免费的试用版,允许您在 .NET 应用程序中探索其条码生成、读取和编辑的功能。此试用版可帮助您在进行购买决策之前评估该库。

Jordi Bardia
软件工程师
Jordi 最擅长 Python、C# 和 C++,当他不在 Iron Software 利用这些技能时,他就在游戏编程。分享产品测试、产品开发和研究的责任,Jordi 在持续的产品改进中增加了巨大的价值。多样的经验使他面临挑战并保持投入,他表示这是在 Iron Software 工作的最喜欢的方面之一。Jordi 在佛罗里达州迈阿密长大,并在佛罗里达大学学习计算机科学和统计学。