2016-11-10 201 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比例呈現。 –