[英]AndroidSVG fuzzy edges on image
我想在Android上顯示條形碼。 作為輸入,我得到SVG字符串。 作為SVG庫,我使用AndroidSVG 。 我使用了圖書館網站上的示例代碼,一切似乎都很好。 但是,當我放大圖像時,邊緣會變形(抗鋸齒?)。 我試圖禁用所有標志。 但是圖像仍然具有模糊邊緣。 我的代碼有什么問題?
碼:
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);
}
}
如果條形的邊緣不完全位於像素邊界上,您將獲得抗鋸齒。 在高分辨率屏幕上,這通常是不可見的。
但是,在您的代碼中,您將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
相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.