android - ZXing 如何设置位图的大小?

标签 android xamarin bitmap xamarin.forms zxing

我正在使用 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;
        
    }
}

另外一部分:

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

这是我使用代码的 xaml:

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

问题是,无论我为 ConvertImageStream 设置什么高度和宽度,生成的图像都不是正方形,而是如下所示:

enter image description here

我怎样才能把它变成正方形?提前致谢。

最佳答案

您的代码正确且图像大小正确:

enter image description here

我通过保存它进行了双重检查:

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

然后拉动它并检查它的大小:

$ 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

我的页面代码:

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;

更新:

您看到的是比图像宽的 Frame,而不是图像本身。更改框架的 BackgroundColor

<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

关于android - ZXing 如何设置位图的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38710996/

相关文章:

android - 无法在 AsyncTaskLoader 中取消正在运行的 AsyncTask

android - 广播接收器不会收到 Intent

ios - Xamarin iOS : Pass credentials over http

c# - 通过 Xamarin.Android 连接到 Microsoft 的 Cognitive Speaker Recognition API

xamarin 形成可缩放图像(跨平台)

c++ - 如何将这个新的 char** 写入 .bmp 文件?

C#位图比较(PinvokeStackimbalance异常)

android - 如何在 Android 中加载大量位图而不导致应用程序崩溃

java - 如何在android模拟器中显示来自URL的图像

java - Android 媒体 HttpRequestHandler 的 Http 响应