Получение растрового изображения такого же размера из imageView - PullRequest
0 голосов
/ 25 июня 2018

Я создаю приложение, которое вырезает форму круга из большого изображения и сохраняет его в виде эскиза.

Для этого я создал 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, которая точно такого же размера?

Примечание. Его не нужно масштабировать до размеров изображения, но растровое изображение должно быть точно такого же размера, возможно, заполняя дополнительное пространство альфа-каналом.

1 Ответ

0 голосов
/ 25 июня 2018

После дальнейших исследований я узнал, что вы не должны никогда использовать image.buildDrawingCache(); или Bitmap bmap = image.getDrawingCache();

Это устаревшие методы, и в результате я получил искаженное изображение, которое было загружено только частично.

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

[( x coord. of circle) / (imageview width)] * [bitmap width]

, используя ...

    BitmapDrawable drawable = (BitmapDrawable) image.getDrawable();
    Bitmap bmap = drawable.getBitmap();

Если вы пытаетесь сделать снимок экрана с изображением, есть PixelCopy (), я не знаю, как его использовать, но это задокументировано на веб-сайте. https://developer.android.com/reference/android/view/PixelCopy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...