2017-05-16 1 views
1

Je voudrais générer un code à barres EAN 13 à l'aide de ZXing.NET dans ASP.NET et le convertir en chaîne base64.Générer un code à barres EAN à l'aide de ZXing.Net et obtenir une chaîne base64

J'ai un problème comment convertir BarcodeWriterPixelData que je suis en train de:

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

Je tentais en utilisant ImageSharp

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

Mais il ne fonctionne pas.

Répondre

2

Pour ce faire, vous pouvez utiliser System.Drawing.Bitmap. Ajouter référence à CoreCompat.System.Drawing package NuGet (il est en version bêta), puis utiliser ce code:

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()); 
    } 
} 

Pour autant que je sais ImageSharp est pas encore sorti. J'ai recommandé CoreCompact basé sur this answer.

+0

Je reçois une erreur Le membre non invocable 'Rectangle' ne peut pas être utilisé comme une méthode. – Cieja

+0

Désolé, j'ai supprimé la "nouvelle" partie. Edité, essayez maintenant. –

+0

Cela fonctionne, mais maintenant j'ai une autre erreur sur la première instruction using: L'initialiseur de type pour 'System.Drawing.GDIPlus' a jeté une exception. Le message entier erro: Message = "Impossible de charger la DLL 'gdiplus': Le module spécifié est introuvable. \ N (Exception de HRESULT: 0x8007007E)" – Cieja

1

Vous pouvez utiliser ImageSharp pour charger les données de pixels brutes (en supposant que pixelData.Pixels est un octet [] contenant des données de pixels au format rgba32 brut). Au lieu d'utiliser Image.Load<Rgba32>(data, width, height) vous devriez utiliser Image.LoadPixelData<Rgba32>(data)

Vous code de chargement final serait:

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

Fondamentalement, le Image.Load<Rgba32>(data) api est pour le chargement des données encodées à savoir png, jpg, etc données formatées. Où comme Image.LoadPixelData<Rgba32>(data) api est pour le chargement des données de pixels bruts dans l'objet image pour le traitement ultérieur/sauvegarde.