Я создаю приложение, которое вырезает форму круга из большого изображения и сохраняет его в виде эскиза.
Для этого я создал FrameLayout для включения ImageView и CustomView, размеры которого соответствуют родительскому. Glide используется для загрузки изображения в ImageView. А в пользовательском представлении, расположенном поверх изображения, есть методы onclick, которые позволяют пользователю перетаскивать масштабируемый круг вокруг изображения.
<FrameLayout
android:layout_width="357dp"
android:layout_height="247dp"
android:layout_marginStart="16dp"
android:layout_marginTop="20dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!--app:srcCompat="@android:drawable/btn_star_big_on" />-->
<com.example.christopher.thumbnailtest.ThumbnailFrame
android:id="@+id/ThumbnailFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
В настоящее время я пытаюсь создать растровое изображение точно такого же размера, как ImageView.
public void cropImage(View view) {
ImageView image = (ImageView) findViewById(R.id.imageView);
BitmapDrawable drawable = (BitmapDrawable) image.getDrawable();
Bitmap bitmap = drawable.getBitmap();
Log.d("bitmap", bitmap.toString());
//Create a bitmap with the same dimensions (thumbnail)
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Log.d("BITMAP_WIDTH", String.valueOf(bitmap.getWidth()));
Log.d("BITMAP_Height", String.valueOf(bitmap.getHeight()));
//Create new canvas with our bitmap to draw into
Canvas canvas = new Canvas(output);
//Set a paint object for a solid colored object
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(0XFF000000);
//Get a handle on current image object
ThumbnailFrame thumbnail = findViewById(R.id.ThumbnailFrame);
//Draw a small circle on the new bitmap (thumbnail) with the same dimensions as that of our thumbnail frame.
canvas.drawCircle(thumbnail.getyPosit(), thumbnail.getxPosit(), thumbnail.getradius(), paint);
Log.d("XPOSIT", String.valueOf(thumbnail.getxPosit()));
Log.d("YPOSIT", String.valueOf(thumbnail.getyPosit()));
Log.d("RADIUS", String.valueOf(thumbnail.getradius()));
//Use Porter.Duff method to make picture ONLY exist in a new bitmap
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//Crop new bitmap with createBitmap
canvas.drawBitmap(bitmap, 0, 0, paint);
//Compress? and save new bitmap as a thumbnail, and send thumbnail URI
}
К сожалению, возвращаемое изображение отличается от размера кадра, и на некоторых изображениях размер растрового изображения изменяется. Когда изначально была загружена форма звезды, она была 150 x 150, для этого конкретного изображения она была (988 x 988), но размеры изображения должны выходить за пределы этого и быть прямоугольными, а не квадратными.
D/bitmap: android.graphics.Bitmap@491f236
D/BITMAP_WIDTH: 988
D/BITMAP_Height: 988
D/XPOSIT: 1378.0
D/YPOSIT: 938.0
D/RADIUS: 50.0
Есть ли способ получить точную растровую версию imageView, которая точно такого же размера?
Примечание. Его не нужно масштабировать до размеров изображения, но растровое изображение должно быть точно такого же размера, возможно, заполняя дополнительное пространство альфа-каналом.