2016-11-10 11 views
0

Ich möchte Barcode auf Android anzeigen. Als Eingabe bekomme ich SVG-String. Als SVG-Bibliothek verwende ich AndroidSVG. Ich habe Beispielcode von der Bibliothekswebsite verwendet und alles scheint in Ordnung zu sein. Aber wenn ich auf das Bild zoome, bekomme ich verzerrte Kanten (Anti-Alias?). Ich habe versucht, alle Flaggen zu deaktivieren. Aber das Bild hat immer noch unscharfe Kanten. Was kann mit meinem Code falsch sein?AndroidSVG fuzzy Kanten auf Bild

Bild: Versuchen Sie, auf max zu zoomen, Sie werden die unscharfen Kanten sehen. enter image description here

Code:

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

Die SVG wird in Bitmap konvertiert, um angezeigt zu werden, Sie müssen die Auflösung erhöhen, damit die Schärfe beim Skalieren erhalten bleibt. – Duopixel

Antwort

0

Wenn die Kanten der Stäbe liegen nicht genau auf Pixelgrenzen, werden Sie Anti-Aliasing bekommen. Auf einem Bildschirm mit hoher Auflösung sollte dies normalerweise nicht sichtbar sein.

In Ihrem Code rendern Sie jedoch das SVG zu einer Bitmap und setzen die Bitmap auf ein ImageView. Wenn diese ImageView eine Größe größer als die Bitmap hat - dh. größer als 400 × 300, dann werden die Anti-Alias-Pixel in dieser Bitmap wahrscheinlich größer und somit besser sichtbar gemacht.

Eine Lösung besteht darin, die Verwendung einer Bitmap zu vermeiden. Verwenden Sie stattdessen eine Picture/PictureDrawable. Auf diese Weise wird der Barcode unabhängig von der Größe in höchster Qualität gerendert. Wie Vektorgrafiken sein sollen.

Folgen Sie dem Beispiel auf dieser Seite:

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

So sollte Ihr Code wahrscheinlich so etwas wie folgt aussehen:

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

} 

Wenn aus irgendeinem Grund müssen Sie Bitmaps verwenden - vielleicht haben Sie Zwischenspeichern sie oder etwas - dann sollten Sie auf Änderungen in der Größe der ImageView achten und dann die Bitmap in der neuen Größe neu erstellen. Die Bitmap hat also immer die gleiche Größe wie die ImageView, der sie zugewiesen ist.

+0

Danke für den Hinweis. Es wurde ein wenig besser, aber einige Pixel sind immer noch auf den Seiten sichtbar http://snpy.in/yrL1xa – kvgr

+0

Es ist nicht auf dem Telefonbildschirm sichtbar, aber ich muss auch mit QR-Code arbeiten, und ich fürchte, es wird Senken Sie die Lesbarkeit des Codes durch Scanner. – kvgr

+0

Veröffentlichen Sie ein Beispiel Barcode SVG, wenn Sie möchten, dass wir es betrachten. Es ist jedoch äußerst unwahrscheinlich, dass das ungerade Antialias-Pixel verhindert, dass es gescannt wird. Wenn Sie das Anti-Aliasing verhindern möchten, sollten Sie sicherstellen, dass sich die Balken an Pixelgrenzen befinden und der Barcode im Maßstab 1: 1 gerendert wird. –