QrCoder Asp. Net - Как убрать шум? - PullRequest
1 голос
/ 26 марта 2020

Сейчас я создаю свой QR-код, используя QrCoder из Asp. Net. Вы можете увидеть мой код ниже:
SvgQrCode:

    public void UpdateText(string value)
    {
        using (var qrGenerator = new QRCodeGenerator())
        {
            using (var qrCodeData = qrGenerator.CreateQrCode(value, QRCodeGenerator.ECCLevel.Q))
            {
                using (var qrCode = new QRCode(qrCodeData))
                {
                    using (var bitmap = qrCode.GetGraphic(1, Color.Black, Color.White, false))
                    {
                        Image.FromData(bitmap);
                    }
                    Text = value;
    }   }   }   }

Xml:

   <Image Source="{Binding Element.ImageSource}"
          RenderOptions.BitmapScalingMode="NearestNeighbor"
          RenderOptions.EdgeMode="Aliased"
          Width="{Binding Element.Width}"
          Height="{Binding Element.Height}"
          Stretch="Uniform">

Что происходит: В сгенерированном QR-коде есть небольшой шум, который вы можете увидеть здесь на скриншоте с левой стороны (левая сторона Gray8, правая сторона BlackWhite):

enter image description here
Что я пробовал: Я изменил в методе Decode Pixelformats с Gray8 на BlackWhite. Результат - скриншот выше (qr код справа).

 internal static BitmapSource Decode(string value, int? pixelWidth, BitmapCacheOption cacheOption = BitmapCacheOption.OnLoad)
 {
        // ..some code..
        var grey = new FormatConvertedBitmap(bitmap, PixelFormats.Gray8, BitmapPalettes.Gray256, 1.0);
        return grey;
 }

Еще одна вещь, которую я попробовал, - это изменить qrCode.GetGraphic(1) на что-то более высокое, например qrCode.GetGraphic(10), что увеличивает pixels per module. Но это не совсем чистый способ решить проблему, потому что шум становится очень маленьким (так что его уже почти не видно), а количество пикселей на модуль увеличивается.

Моя проблема: Я использую метод декодирования для qr-кодов, штрих-кодов и изображений. Так что, если бы я добавил изображение, оно было бы черно-белым. Конечно, я могу использовать оператор if и проверить, что если это изображение, или qr / штрих-код. Но почему PixelFormats.Gray8 создает шум? Почему это не чисто?

1 Ответ

0 голосов
/ 31 марта 2020

Я нашел проблему. Я пропустил эти строки и не понял, что .jpeg был выбран в качестве формата:

public void FromData(Bitmap bitmap)
{
   using (var ms = new MemoryStream())
   {
     bitmap.Save(ms, ImageFormat.Jpeg);
     //...
...