位图不绘制反锯齿(Bitmap not drawn anti-aliased)

2019-07-18 07:57发布

我有一个自定义View总是绘制一个Bitmap在一定的旋转。 我重写onDraw方法,旋转Canvas ,并与抗锯齿的绘制位图Paint

public RotatedImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    someBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder);
}

@Override
protected void onDraw(Canvas canvas) {

    // Save and rotate canvas
    canvas.save();
    canvas.rotate(3F, getWidth() / 2, getHeight());

    // Draw the icon
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    canvas.drawBitmap(someBitmap, 0, 0, p);
    canvas.drawRoundRect(new RectF(75, 50, 225, 200), 10, 10, p);

    // All done; restore canvas
    canvas.restore();
}

但是,我总是对位图锯齿状边缘。 需要注意的是roudned矩形得到很好的消除锯齿边缘。 此外,当我申请p.setFilterBitmap(true); 这个工程(位图表面被过滤/平滑)正确。 我缺少的东西吗?

这里有一个屏幕的孤立的例子最小的Android项目,显示绘制非反锯齿位图的角度,从资源加载: https://bitbucket.org/erickok/antialiastest

更新:我也曾尝试以下操作:

    Paint p = new Paint();
    p.setAntiAlias(true);
    p.setFilterBitmap(true);
    p.setDither(true);
    canvas.drawBitmap(someBitmap, 0, 0, p);

但是,这并不能帮助作为setFilterBitmap过滤表面; 它不抗混叠的边缘。 此外, setAntiAlias不一样直接设置标志的Paint构造。 如有疑问,请尝尝我最小的测试项目。 非常感谢您的帮助!

Answer 1:

我发现,为什么我没有得到任何抗锯齿:硬件加速。 之后,我(纯属偶然)在我的Nexus One测试它突然的工作,而我的Nexus 7没有。 原来, ANTI_ALIAS_FLAG什么也不做,当Canvas使用硬件加速绘制。 有了这种洞察力,我发现罗曼盖伊的StackOverflow上回答 ,回答我的问题。

解决方案似乎是:添加透明边框的每一个位图(手动或在飞行中)或“做着色器的东西”。 他们都不是很吸引我。 相反,我禁用硬件加速上使用我的自定义视图setLayerType方法。 请注意,这是因为API级别11可用,但(不是偶然的),你将不必应付任何方式之前的硬件加速。 所以我加入,在视图中的构造函数:

    if (android.os.Build.VERSION.SDK_INT >= 11) {
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

我已经更新为有志于在到位桶上面提到的开源项目。



Answer 2:

使用setFilterBitmap(真)。

paint_object.setFilterBitmap(true);

它为我工作太..我从这个问题得到了它

绘制具有抗混叠旋转后的位

消除锯齿标志和FilterBitmap标志设置为true,又一同做位图的边缘光滑,我已经测试了三星Galaxy王牌,Android 2.2的...

我的测试代码是

Paint p = new Paint();
p.setAntiAlias(true);
p.setFilterBitmap(true);
canvas.drawBitmap(someBitmap, new Matrix(), p);


Answer 3:

在我来说,我这样做,但可能是它喜欢你做的事:

Paint paint = new Paint();
paint.setAntiAlias(true);

试一试。

祝好运!



Answer 4:

我测试的是上建议,他们为我工作。 也许这些问题是在你的位图? 也许在你的设备? 下面是创建位图内嵌代码。 检查这个例子你的作品。

public class BitmapRotateActivity extends Activity { 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new MyView(this));
  }
  class MyView extends View {

    Bitmap bitmap;
    public MyView(Context context) {
      super(context);

      bitmap = Bitmap.createBitmap(160, 160, Bitmap.Config.RGB_565);
      Paint p = new Paint();
      p.setColor(Color.RED);
      p.setStyle(Paint.Style.FILL);
      Canvas c = new Canvas(bitmap);
      c.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), p);
    }

    @Override
    protected void onDraw(Canvas canvas) {
      Paint pbg = new Paint();
      pbg.setStyle(Paint.Style.FILL);
      pbg.setColor(0xffe0e0ff);
      canvas.drawRect(0, 0, getWidth(), getHeight(), pbg);

      Paint p = new Paint();
      p.setAntiAlias(true);
      p.setFilterBitmap(true);

      canvas.save();
      canvas.rotate(3F, getWidth() / 2, getHeight() / 2);
      canvas.drawBitmap(bitmap, 30, 30, p);
      canvas.restore();
    }
  }
}


Answer 5:

我有同样的问题,并尝试了所有这些修正。 什么终于摸索被禁止全局硬件加速在AndroidManifest.xml文件中:

 <application
       android:hardwareAccelerated="false" 
  ...
 >

然后停用inSampleSize当我装我的图像位图,从而使(I假定)图像会以足够高的质量加载,以避免任何曲折,然后,为我的实际的ImageView,使用上述的建议:设置层类型,以查看.LAYER_TYPE_SOFTWARE,与设置为true(如上)和过滤器位图的涂料对象抗锯齿上。



文章来源: Bitmap not drawn anti-aliased