【问题标题】:AndroidSVG fuzzy edges on image图像上的 AndroidSVG 模糊边缘
【发布时间】:2017-03-24 09:11:01
【问题描述】:

我想在 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 转换为位图才能显示,您需要提高分辨率以使其在缩放时保持清晰度。

标签: android svg androidsvg


【解决方案1】:

如果条的边缘不完全位于像素边界上,您将获得抗锯齿。在高分辨率屏幕上,这通常不可见。

但是,在您的代码中,您将 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 大小相同。

【讨论】:

  • 感谢您的建议。稍微好点了,但侧面仍然可以看到一些像素snpy.in/yrL1xa
  • 它在手机屏幕上不可见,但我还需要使用二维码,我担心它会降低扫描仪对二维码的可读性。
  • 如果您希望我们查看,请发布示例条形码 SVG。但是,奇怪的抗锯齿像素极不可能阻止它被扫描。如果要防止抗锯齿,应确保条形图位于像素边界上,并且条码以 1:1 的比例呈现。
猜你喜欢
  • 2015-03-26
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2011-03-17
  • 1970-01-01
  • 2014-09-02
  • 2021-03-02
相关资源
最近更新 更多