2015-03-23 2 views
1

Как я могу вырезать круг из разных форм растрового изображения в андроиде.Как вырезать круг из разных форм растрового изображения в android

Я попробовал этот код, но некоторые изображения растянуты:

public Bitmap getRoundedShape(Bitmap scaleBitmapImage) { 
    int targetWidth = 240; 
    int targetHeight = 200; 
    Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
      targetHeight,Bitmap.Config.ARGB_8888); 

    Canvas canvas = new Canvas(targetBitmap); 
    Path path = new Path(); 
    path.addCircle(((float) targetWidth - 1)/2, 
      ((float) targetHeight - 1)/2, 
      (Math.min(((float) targetWidth), 
        ((float) targetHeight))/2), 
      Path.Direction.CCW); 

    canvas.clipPath(path); 
    Bitmap sourceBitmap = scaleBitmapImage; 
    canvas.drawBitmap(sourceBitmap,new Rect(0, 0, sourceBitmap.getWidth(), 
        sourceBitmap.getHeight()), 
      new Rect(0, 0, targetWidth, targetHeight), null); 
    return targetBitmap; 
} 

ответ

0

Если вы хотите круговой срез изображения, вам нужно найти самый большой квадрат, который центрирует изображение. Учитывая это, следуя линии исправляет проблему растяжку:

Bitmap bitmap = ThumbnailUtils.extractThumbnail(bitmap, radius, radius, ThumbnailUtils.OPTIONS_RECYCLE_INPUT); 

Этот метод создает круговой разрез целевой битовой карты:

private Bitmap getCircularBitmap(int radius, Bitmap bitmap) { 
    Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
    Bitmap bmp = Bitmap.createBitmap(radius, radius, conf); 
    Canvas canvas = new Canvas(bmp); 

    // creates a centered bitmap of the desired size 
    bitmap = ThumbnailUtils.extractThumbnail(bitmap, radius, radius, ThumbnailUtils.OPTIONS_RECYCLE_INPUT); 
    BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 

    paint.setShader(shader); 
    RectF rect = new RectF(0, 0, radius, radius); 
    canvas.drawRoundRect(rect, radius, radius, paint); 

    return bmp; 
} 
+0

Это значение радиуса окружности вы хотите создать. Как вы знаете, это должно быть половина мин (ширина, высота). В вашей ситуации 100 будут в порядке. Пожалуйста, попробуйте и дайте мне знать. –

+0

Вы правы. Я отредактировал свой ответ. Измените эту строку: «RectF rect = new RectF (0, 0, радиус * 2, радиус * 2);». Параметры должны быть «(0, 0, радиус, радиус)». Это нормально? –

+0

он не делает его круг своим эффектом только в одном углу –

0

Один подход должен был бы использовать BitmapShader.

Идея состоит в том, чтобы использовать Paint с BitmapShader, чтобы нарисовать текстуру, используя растровое изображение. Затем вы просто нарисуете круг на холсте.

Вот отличный пример использования BitmapShader. В этом примере рисуется прямоугольник с закругленными углами, но он может быть таким же простым кругом.

Android Recipe #1, image with rounded corners

Смежные вопросы