使用ZXing.Net生成EAN条形码并获取base64字符串

4
我想使用ZXing.NET在ASP.NET中生成EAN 13条形码,并将其转换为base64字符串。
我遇到了一个问题,如何将我从中获得的BarcodeWriterPixelData进行转换:
BarcodeWriterPixelData writer = new BarcodeWriterPixelData()
{
   Format = BarcodeFormat.EAN_13
};
var pixelData = writer.Write(barcodeModel.BarcodeNumber);

我尝试使用ImageSharp

var base64String = string.Empty;
using (Image<Rgba32> image = Image.Load<Rgba32>(pixelData.Pixels))
{
    base64String = image.ToBase64String();
}

但是它没有起作用。
2个回答

6

您可以使用 System.Drawing.Bitmap 来实现此操作。添加对 CoreCompat.System.Drawing nuget 包的引用(它处于 beta 版本),然后使用以下代码:

BarcodeWriterPixelData writer = new BarcodeWriterPixelData()
{
    Format = BarcodeFormat.EAN_13
};
var pixelData = writer.Write(barcodeModel.BarcodeNumber);

using (var bitmap = new System.Drawing.Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb))
{
    using (var ms = new System.IO.MemoryStream())
    {
        var bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        try
        {
             // we assume that the row stride of the bitmap is aligned to 4 byte multiplied by the width of the image   
            System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
        }
        finally
        {
            bitmap.UnlockBits(bitmapData);
        }

        // PNG or JPEG or whatever you want
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        var base64str = Convert.ToBase64String(ms.ToArray());
    }
}

据我所知,ImageSharp目前还未发布。根据这个答案,我推荐使用CoreCompact。

我收到了一个错误:Non-invocable member 'Rectangle' cannot be used like a method。 - mskuratowski
抱歉,我不知怎么把“new”部分删掉了。已经编辑好了,请再试一次。 - Dávid Molnár
它可以工作,但现在我在第一个using语句上又遇到了另一个错误:'System.Drawing.GDIPlus'的类型初始化程序引发了异常。整个错误消息是:Message =“无法加载DLL 'gdiplus':找不到指定的模块。\n(HRESULT异常:0x8007007E)” - mskuratowski
你是否将所有的dll文件都包含在容器中了?例如CoreCompat.System.Drawing.dll,System.Drawing.Primitives.dll等等。尝试执行“发布”命令并查看输出结果。 - Dávid Molnár
让我们在聊天中继续这个讨论 - mskuratowski
显示剩余3条评论

3
您可以使用ImageSharp加载原始像素数据(假设pixelData.Pixels包含原始rgba32格式的像素数据)。您应该使用Image.LoadPixelData<Rgba32>(data),而不是使用Image.Load<Rgba32>(data, width, height)

因此,您最终的加载代码将是:

var base64String = string.Empty;
using (Image<Rgba32> image = Image.LoadPixelData<Rgba32>(pixelData.Pixels, width, height))
{
    base64String = image.ToBase64String(ImageFormats.Png);
}

基本上,Image.Load<Rgba32>(data) API 用于加载编码数据,例如png、jpg等格式的数据。而 Image.LoadPixelData<Rgba32>(data) API 则用于将原始像素数据加载到图像对象中以供以后处理/保存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接