从imageView获取相同大小的位图

时间:2018-06-25 00:36:52

标签: java android android-bitmap android-glide bitmapimage

我正在制作一个从大图像上切出一个圆形并将其保存为缩略图的应用。

为此,我创建了一个FrameLayout来封装一个ImageView和一个CustomView,它们的尺寸与父级匹配。滑行用于将图像加载到ImageView中。而且,位于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),但是imageview的尺寸应超过该尺寸,并且应为矩形而不是正方形。

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的位图版本?

注意:不需要将其缩放到imageview的尺寸,但是位图应该是完全相同的大小,也许可以用alpha通道填充额外的空间。

1 个答案:

答案 0 :(得分:0)

经过进一步研究,我了解到您应该从不使用 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