AndroidSVG模糊边缘图像

时间:2016-11-10 10:59:25

标签: android svg androidsvg

我想在Android上显示条形码。作为输入我得到SVG字符串。作为SVG库,我使用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);
    }
}

1 个答案:

答案 0 :(得分: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相同。

相关问题