Saya memiliki bitmap dan saya ingin memotong wilayah melingkar dari bitmap ini. Semua piksel di luar lingkaran harus transparan. Bagaimana saya bisa melakukan ini?
108
Saya memiliki bitmap dan saya ingin memotong wilayah melingkar dari bitmap ini. Semua piksel di luar lingkaran harus transparan. Bagaimana saya bisa melakukan ini?
Setelah bertukar pikiran panjang, saya menemukan solusinya
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
dan digunakan dalam kelas utilitas non-instantiated dari metode statis serupa.canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
untuk menghasilkan Lingkaran dari persegi panjang
sumber
Anda dapat membuat imageview Anda melingkar menggunakan RoundedBitmapDrawable
berikut adalah kode untuk mencapai roundedImageview:
sumber
@Gene mengomentari jawaban di atas yang menyarankan penggunaan
clipPath
sebagai opsi untuk memotong gambar sebagai lingkaran.Berikut ini adalah implementasi bersih dari ini:
Ini dapat ditambahkan ke kelas utilitas.
sumber
c.drawBitmap(b, 0, 0, null);
, yang menggunakan transformasi identitas default.Saya pikir solusi ini berfungsi lebih baik dengan semua jenis persegi panjang, ubah ukuran piksel jika Anda ingin gambar kecil atau besar:
sumber
Ini dapat dengan mudah dilakukan dalam xml juga tanpa memotong bitmap yang sebenarnya, Anda hanya perlu membuat topeng gambar melingkar dan menempatkannya di atas gambar Anda yang sebenarnya. Berikut adalah potongan kode yang saya gunakan:
circle.xml
your_layout.xml (Abaikan "android: scaleType =" fitXY "" jika Anda tidak membutuhkannya)
dimen.xml
Tampilan Gambar OutPut:
Semoga bermanfaat bagi seseorang !!! :)
sumber
Anda dapat menggunakan kode ini, itu akan berhasil
sumber
Anda dapat menggunakan kode ini, itu akan berhasil
sumber
Saya sarankan menambahkan
bitmap.recycle()
jika Anda tidak membutuhkannya lagi, itu akan mencegah kesalahan OutOfMemory.sumber
Berikut adalah varian Kotlin yang menggunakan metode ekstensi
sumber
Untuk orang yang menginginkan bagian tengah persegi panjang (saya), tambahkan ini sebelum memotong:
Android Crop Center dari Bitmap
sumber
Berdasarkan jawaban [Jachumbelechao Unto Mantekilla], kode ini berfungsi seperti pesona bagi orang yang mencari solusi Kotlin:
sumber
Sekarang, jawaban yang benar:
sumber
Kotin Fucntion
sebut saja dengan kode ini
sumber
Saya yakin solusi termudah adalah membuat BitmapShader dari Bitmap Anda, meneruskannya ke objek paint Anda dan kemudian cukup memanggil sesuatu seperti canvas.drawCircle (cx, cy, radius, paint);
sebagai contoh
Beginilah cara https://github.com/hdodenhof/CircleImageView juga melakukannya, Anda dapat membaca kode sumbernya di sini: https://github.com/hdodenhof/CircleImageView/blob/master/circleimageview/src/main/java /de/hdodenhof/circleimageview/CircleImageView.java
sumber
sumber
Tidak yakin ini adalah pertanyaan pemrograman, tetapi ...
Solusi termudah adalah membuat area luar transparan di bitmap sumber. Jika tidak, Anda harus menghitung piksel mana yang berada di luar lingkaran, dan menyetel alfa yang sesuai (alfa = 0 untuk transparansi penuh).
sumber