2016-11-10 5 views
0

Я хочу отобразить штрих-код на Android. В качестве ввода я получаю строку SVG. В качестве библиотеки SVG я использую AndroidSVG. Я использовал образец кода с веб-сайта библиотеки, и все выглядит нормально. Но когда я увеличиваю изображение, я получаю искаженные края (Anti-alias?). Я попытался отключить все флаги. Но изображение все еще имеет нечеткие края. Что может быть неправильным с моим кодом?Нечеткие края AndroidSVG на изображении

Изображение: Постарайтесь увеличить масштаб до максимума, вы увидите нечеткие края. enter image description here

Код:

private void loadQRCode(String svgString) { 
    SVG svg = null; 
    try { 
     svg = SVG.getFromString(svgString); 
    } catch (SVGParseException e) { 
     e.printStackTrace(); 
    } 

    if (svg.getDocumentWidth() != -1) { 
     int widthPx = Utils.pxFromDp(400); 
     int heightDp = Utils.pxFromDp(300); 

     svg.setDocumentWidth(widthPx); 
     svg.setDocumentHeight(heightDp); 

     int width = (int) Math.ceil(svg.getDocumentWidth()); 
     int height = (int) Math.ceil(svg.getDocumentHeight()); 
     Bitmap newBM = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

     Canvas bmcanvas = new Canvas(newBM); 
     final DrawFilter filter = new PaintFlagsDrawFilter(Paint.ANTI_ALIAS_FLAG| Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG, 0); 
     bmcanvas.setDrawFilter(filter); 

     barcode.setLayerType(View.LAYER_TYPE_SOFTWARE,null); 
     bmcanvas.drawRGB(255, 255, 255); 

     svg.renderToCanvas(bmcanvas); 
     barcode.setImageBitmap(newBM); 
    } 
} 
+0

SVG преобразуется в растровое изображение для отображения, вам необходимо увеличить разрешение, чтобы он сохранял резкость при масштабировании. – Duopixel

ответ

0

Если края брусков не лежат точно на границах пикселей, вы получите сглаживание. На экране с высоким разрешением это обычно не должно быть видимым.

Однако в вашем коде вы преобразуете SVG в растровое изображение и устанавливаете растровое изображение в ImageView. Если этот ImageView имеет размер больше, чем битмап - т.е. более 400 x 300, тогда сглаженные пиксели в этом растровом изображении, скорее всего, будут увеличены и, следовательно, станут более заметными.

Одним из решений является избежание использования растрового изображения. Вместо этого используйте Picture/PictureDrawable. Таким образом, штрих-код будет отображаться с наивысшим качеством независимо от его размера. Предполагается, что векторная графика должна быть.

Следуйте примеру на этой странице:

http://bigbadaboom.github.io/androidsvg/use_with_ImageView.html

Так что ваш код, вероятно, следует искать что-то вроде следующего:

private void loadQRCode(String svgString) { 
    try { 
     SVG svg = SVG.getFromString(svgString); 

     barcode.setLayerType(View.LAYER_TYPE_SOFTWARE,null); 
     Drawable drawable = new PictureDrawable(svg.renderToPicture()); 
     barcode.setImageDrawable(drawable); 

    } catch (SVGParseException e) { 
     e.printStackTrace(); 
    } 

} 

Если по какой-то причине вам нужно использовать растровые изображения - возможно, вам кешируют их или что-то в этом роде - тогда вы должны следить за изменениями в размере ImageView, а затем воссоздать растровое изображение нового размера. Таким образом, битмап всегда имеет тот же размер, что и ImageView, которому он назначен.

+0

Спасибо за совет. Это немного улучшилось, но некоторые пиксели по-прежнему видны по бокам. Http://snpy.in/yrL1xa – kvgr

+0

Это не видно на экране телефона, но мне также нужно будет работать с QR-кодом, и я боюсь, что он будет снизить читаемость кода сканерами. – kvgr

+0

Отправьте пример штрих-кода SVG, если вы хотите, чтобы мы посмотрели на него. Но крайне маловероятно, что нечетный сглаженный пиксель предотвратит его сканирование. Если вы хотите предотвратить сглаживание, вы должны убедиться, что полосы находятся на границах пикселей, а штрих-код отображается в масштабе 1: 1. –

Смежные вопросы