如何在低分辨率图像视图上绘制"crisp and sharp"线条?



我正在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,0,0,null);
Paint paint = new Paint();
targetCanvas.drawLine(0f,100f, imageBitmap.getWidth(),100f,paint);
imageView.setImageDrawable(new BitmapDrawable(getResources(),duplicateBitmap));

当图像具有适当或良好的分辨率时,此操作效果良好。

但当图像的分辨率较低时,它看起来是这样的。(这是一次糟糕的经历(

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

这一次,我想我应该用高分辨率的画布来掩盖图像。但后来我对如何实现这个想法一无所知。此外,这可能是内存效率低下的实现。

我终于找到了@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, attrs, defStyleAttr);
}
@Override
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
// logic for drawing goes here
}
}

如果您真的需要一个带结果的位图,请确保重复位图的大小与您绘制它的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)
}
}

最新更新