2016-08-02 16 views
7

Tôi đang sử dụng ZXing để tạo mã QR. Đây là những gì mã của tôi trông giống như:Làm thế nào để thiết lập kích thước của bitmap trong 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; 

    } 
} 

Và phần khác:

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

Đây là XAML nơi tôi đang sử dụng mã:

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

Vấn đề là, cho dù tôi đặt chiều cao và chiều rộng cho ConvertImageStream là gì, hình ảnh kết quả không phải là hình vuông, nhưng trông giống như sau:

enter image description here

Làm cách nào để biến nó thành hình vuông? Cảm ơn trước.

Trả lời

2

Mã của bạn là chính xác và hình ảnh có kích thước chính xác:

enter image description here

tôi gấp đôi kiểm tra bằng cách tiết kiệm nó:

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

Và sau đó kéo nó và kiểm tra kích thước của nó:

$ 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 

Mã trang của tôi:

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; 

Cập nhật:

Đây là Frame rằng bạn đang nhìn thấy đó là rộng hơn thì hình ảnh, không phải là hình ảnh của chính nó. Thay đổi BackgroundColor của Frame

<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

bất kỳ đề xuất về lý do tại sao nó trông giống như những gì tôi đã đăng trong ứng dụng của tôi? – nicks

+1

@NikaGamkrelidze Bạn có thể đăng xaml (hoặc mã) của bạn cho trang đó trong câu hỏi của bạn hay thử mã trang trong câu trả lời của tôi trước để xem bạn có nhận được kết quả tương tự như mình không ... – SushiHangover

+0

vui lòng xem chỉnh sửa cho mã XAML – nicks

Các vấn đề liên quan