2016-08-02 29 views
7

Używam ZXing do generowania kodu QR. To właśnie mój kod wygląda następująco:Jak ustawić rozmiar bitmapy w ZXing?

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


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

    } 
} 

az drugiej strony:

[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; 
     } 
    } 
} 

Oto XAML gdzie używam kod:

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

Problem polega na tym, Bez względu na to, co ustawię jako wysokość i szerokość dla ConvertImageStream, wynikowy obraz nie jest kwadratowy, ale raczej wygląda tak:

enter image description here

Jak mogę zmienić go w kwadrat? Z góry dziękuję.

Odpowiedz

2

Twój kod jest poprawny, a obraz odpowiednio dobrane:

enter image description here

I dwukrotnie sprawdzane przez zapisanie go:

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

A potem pociągając go i sprawdzenie jego rozmiar:

$ 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 

Moja strona kod:

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; 

Aktualizacja:

To Frame że widzisz, że jest szerszy następnie obrazu, a nie sam obraz. Zmień BackgroundColor ramy

<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

wszelkie sugestie na temat, dlaczego to wygląda, co napisałem w mojej aplikacji? – nicks

+1

@NikaGamkrelidze Czy umieścisz swój xaml (lub kod) dla tej strony w pytaniu, lub spróbujesz najpierw użyć kodu strony w mojej odpowiedzi, aby zobaczyć, czy uzyskasz taki sam wynik jak ja ... – SushiHangover

+0

zobacz edycję kodu XAML – nicks