У меня есть растровое изображение, и я хочу обрезать круговую область из этого растрового изображения. Все пиксели за пределами круга должны быть прозрачными. Как я могу это сделать?
108
У меня есть растровое изображение, и я хочу обрезать круговую область из этого растрового изображения. Все пиксели за пределами круга должны быть прозрачными. Как я могу это сделать?
После долгого мозгового штурма я нашел решение
public Bitmap getCroppedBitmap(Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
// canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
bitmap.getWidth() / 2, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
//Bitmap _bmp = Bitmap.createScaledBitmap(output, 60, 60, false);
//return _bmp;
return output;
}
static
и использован в не созданном служебном классе аналогичных статических методов.canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
для создания круга из прямоугольников
источник
Вы можете сделать свое изображение круглым, используя RoundedBitmapDrawable
вот код для достижения roundedImageview:
источник
@Gene прокомментировал ответ выше, в котором предлагалось использовать
clipPath
в качестве опции для обрезки изображения в виде круга.Ниже приводится чистая реализация этого:
Это можно было бы добавить в служебный класс.
источник
c.drawBitmap(b, 0, 0, null);
, что использует преобразование идентичности по умолчанию.Я думаю, что это решение лучше работает с любым типом прямоугольника, измените размер пикселя, если вы хотите, чтобы изображение было маленьким или большим:
источник
Это можно легко сделать и в xml, не обрезая фактическое растровое изображение. Вам просто нужно создать круглую маску изображения и поместить ее поверх фактического изображения. Вот фрагмент кода, который я использовал:
circle.xml
your_layout.xml ( игнорируйте "android: scaleType =" fitXY "", если он вам не нужен)
dimen.xml
Просмотр изображения OutPut:
Надеюсь, это может быть кому-то полезно !!! :)
источник
вы можете использовать этот код, он будет работать
источник
вы можете использовать этот код, он будет работать
источник
Я рекомендую добавить,
bitmap.recycle()
если он вам больше не нужен, это предотвратит ошибку OutOfMemory.источник
Вот вариант Kotlin с использованием метода расширения
источник
Для человека, которому нужен центр прямоугольника (я), добавьте это перед разрезанием:
Центр кадрирования растрового изображения Android
источник
Основываясь на ответе [Jachumbelechao Unto Mantekilla], этот код работает как шарм для людей, которые ищут решение Kotlin:
источник
Теперь правильный ответ:
источник
Котин Fucntion
назовите это этим кодом
источник
Я считаю, что самое простое решение - создать BitmapShader вашего Bitmap, передать его вашему объекту рисования, а затем просто вызвать что-то вроде canvas.drawCircle (cx, cy, radius, paint);
например
Вот как это сделал https://github.com/hdodenhof/CircleImageView , вы можете прочитать исходный код здесь: https://github.com/hdodenhof/CircleImageView/blob/master/circleimageview/src/main/java /de/hdodenhof/circleimageview/CircleImageView.java
источник
источник
Не уверен, что это вопрос программирования, но ...
Самым простым решением было бы сделать внешнюю область прозрачной в исходном растровом изображении. В противном случае вам придется вычислить, какие пиксели находятся за пределами круга, и соответственно установить альфа (альфа = 0 для полной прозрачности).
источник