2016-08-02 23 views
7

Ich verwende ZXing, um einen QR-Code zu generieren. Dies ist, was mein Code wie folgt aussieht:Wie wird die Größe der Bitmap in ZXing festgelegt?

public partial class QRPage : ContentPage 
{ 
    public QRPage() 
    { 
     InitializeComponent(); 


     var stream = DependencyService.Get<IBarcodeService>().ConvertImageStream("nika"); 
     qrImage.Source = ImageSource.FromStream(() => { return stream; }); 
     qrImage.HeightRequest = 200; 

    } 
} 

Und andererseits:

[assembly: Xamarin.Forms.Dependency(typeof(BarcodeService))] 
namespace MyApp.Droid 
{ 
    public class BarcodeService : IBarcodeService 
    { 
     public Stream ConvertImageStream(string text, int width = 500, int height = 500) 
     { 
      var barcodeWriter = new ZXing.Mobile.BarcodeWriter 
      { 
       Format = ZXing.BarcodeFormat.QR_CODE, 
       Options = new ZXing.Common.EncodingOptions 
       { 
        Width = width, 
        Height = height, 
        Margin = 2 
       } 
      }; 

      barcodeWriter.Renderer = new ZXing.Mobile.BitmapRenderer(); 
      var bitmap = barcodeWriter.Write(text); 
      var stream = new MemoryStream(); 
      bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream); 
      stream.Position = 0; 
      return stream; 
     } 
    } 
} 

Hier ist die XAML, wo ich den Code bin mit:

<StackLayout Padding="20,30,20,30"> 
    <Label Text="..." FontSize="Medium "/> 
    <Frame VerticalOptions="CenterAndExpand"> 
     <Image x:Name="qrImage" WidthRequest="300" /> 
    </Frame> 
    ... 
</StackLayout> 

Das Problem ist, egal, was ich als Höhe und Breite für ConvertImageStream einstellen, das resultierende Bild ist nicht quadratisch, sieht aber eher so aus:

enter image description here

Wie kann ich es in ein Quadrat verwandeln? Danke im Voraus.

Antwort

2

Ihr Code korrekt ist und das Bild korrekt bemessen:

var filePath = System.IO.Path.Combine(Environment.ExternalStorageDirectory.AbsolutePath, "qrcode.png"); 
using (var fileStream = new FileStream(filePath, FileMode.Create)) 
{ 
    bitmap.Compress(Bitmap.CompressFormat.Png, 100, fileStream); 
} 

Und dann ziehen und die Überprüfung seiner Größe:

enter image description here

ich durch Speichern geprüft verdoppelten

$ adb pull /sdcard/qrcode.png 
[100%] /sdcard/qrcode.png 
$ identify qrcode.png 
qrcode.png PNG 500x500 500x500+0+0 8-bit sRGB 2.85KB 0.000u 0:00.000 

Mein Seitencode:

var image = new Image(); 
var content = new ContentPage 
{ 
    BackgroundColor = Color.Red, 
    Title = "ZXingQRCode", 
    Content = new StackLayout 
    { 
     VerticalOptions = LayoutOptions.Center, 
     Children = { 
      new Label { 
       HorizontalTextAlignment = TextAlignment.Center, 
       Text = "StackOverflow", 
       FontSize = 40 
      }, 
      image 
     } 
    } 
}; 
MainPage = new NavigationPage(content); 
var stream = DependencyService.Get<IBarcodeService>().ConvertImageStream("https://StackOverflow.com"); 
image.Source = ImageSource.FromStream(() => { return stream; }); 
image.HeightRequest = 250; 

Update:

Es ist die Frame, die Sie sehen, das ist breiter als das Bild, nicht das Bild selbst. Ändern Sie den BackgroundColor des Rahmen

<StackLayout Padding="20,30,20,30"> 
    <Label Text="..." FontSize="Medium" /> 
    <Frame VerticalOptions="CenterAndExpand" BackgroundColor="Red"> 
     <Image x:Name="qrImage" WidthRequest="300" /> 
    </Frame> 
</StackLayout> 

enter image description here

+0

irgendwelche Vorschläge auf, warum es sieht aus wie das, was ich in meiner app geschrieben? – nicks

+1

@NikaGamkrelidze Können Sie Ihren XAML (oder Code) für diese Seite in Ihre Frage eingeben, oder versuchen Sie den Seitencode in meiner Antwort zuerst, um zu sehen, ob Sie das gleiche Ergebnis wie ich ... – SushiHangover

+0

erhalten Sie die Bearbeitung für den XAML-Code – nicks