如何在低分辨率ImageView上绘制“清晰且清晰”的线条?

问题描述

我通过执行以下操作在ImageView上绘制线条:

Bitmap imageBitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
Bitmap duplicateBitmap = Bitmap.createBitmap(imageBitmap.getWidth(),imageBitmap.getHeight(),Bitmap.Config.RGB_565);

Canvas targetCanvas = new Canvas(duplicateBitmap);
targetCanvas.drawBitmap(imageBitmap,null);
Paint paint = new Paint();
targetCanvas.drawLine(0f,100f,imageBitmap.getWidth(),paint);
imageView.setImageDrawable(new BitmapDrawable(getResources(),duplicateBitmap));

这很好when the Image has a decent or good resolution

但是看起来像这样when the image has a low resolution。 (这是不好的经历)

现在,如何在低分辨率图像上绘制清晰锐利的线条?

我一次想过应该用高分辨率画布遮盖图像。但是那时我对如何继续这个想法一无所知。另外,这可能是内存效率低下的实现。

解决方法

我终于知道了@D。 Karchnak的指导...

假设您的手机屏幕为1080x1920,则使用 全屏ImageView,因此该ImageView也是1080x1920。现在 您将.png图像加载为BitmapDrawable。此PNG图片有一个 分辨率为400x400,因此BitmapDrawable中的位图为 也是400x400。如果将此“小”位图绘制到全屏 ImageView,由于分辨率低,它将变得模糊不清。如果你 在此400x400位图上画一条线,这条线也会变得模糊 出来。这就是为什么它以不错的分辨率或良好的分辨率工作的原因。

我要做的就是创建一个Android ImageView的子类,然后将我的绘图逻辑转移到onDraw方法中(当然,在重写它之后)。像这样:

public class FineLineImageView extends AppCompatImageView {

    public FineLineImageView(Context context) {
        this(context,null);
    }

    public FineLineImageView(Context context,@Nullable AttributeSet attrs) {
        this(context,attrs,0);
    }

    public FineLineImageView(Context context,@Nullable AttributeSet attrs,int defStyleAttr) {
        super(context,defStyleAttr);
    }

    @Override
    protected void onDraw(final Canvas canvas) {
        super.onDraw(canvas);
        // logic for drawing goes here
    }
}
,

如果您确实需要带有结果的位图,请确保repeatingBitmap的大小与用于绘制它的ImageView的大小相同。

如果您需要的是在ImageView上绘制网格,我将创建一个自定义类,扩展ImageView。覆盖它的draw(Canvas)方法,并使用提供的Canvas绘制网格。

此代码如下所示:

class GridImageView(context: Context....): ImageView(...) {
    val gridPaint = Paint() //Set color,strokeWidth etc...

    @Override
    fun onDraw(canvas: Canvas) {
       super.onDraw(canvas)

       //TODO - complex grid drawing here...
       canvas.drawLine(x1,y1,x2,y2,paint)
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...