web-dev-qa-db-ja.com

画像を正方形にトリミング-Android

長方形の画像(600 x 300)を左右からカットして正方形のImageViewに合わせるにはどうすればよいですか?画像のサイズを変更するのではなく、単に300 x 300にトリミングします。

[解決策]

@blackbeltが言ったように

Bitmap cropImg = Bitmap.createBitmap(src, startX, startY, dstWidth, dstHeight);

画像のトリミングに最適です。では、異なるサイズの画像を自動的にトリミングするにはどうすればよいでしょうか。そのための簡単なコードを作成します。

// From drawable
Bitmap src= BitmapFactory.decodeResource(context.getResources(), R.drawable.image);

// From URL
Bitmap src = null;
try {
    String URL = "http://www.example.com/image.jpg";
    InputStream in = new Java.net.URL(URL).openStream();
    src = BitmapFactory.decodeStream(in);
} catch (Exception e) {
    e.printStackTrace();
}

int width = src.getWidth();
int height = src.getHeight();
int crop = (width - height) / 2;
Bitmap cropImg = Bitmap.createBitmap(src, crop, 0, height, height);

ImageView.setImageBitmap(cropImg);
18
KiKo

使用できます

Bitmap dst = Bitmap.createBitmap(src, startX, startY, dstWidth, dstHeight);

ドキュメントから:

ソースビットマップの指定されたサブセットから不変のビットマップを返します。新しいビットマップはソースと同じオブジェクトであるか、コピーが作成されている可能性があります。元のビットマップと同じ密度で初期化されます。

ここ ドキュメントを見つけることができます

3
Blackbelt

上記の答えについて少し拡大

状況によってはexceptionまたはになる可能性があるため次のように、Bitmap.createBitmap()を使用するだけで、期待される結果ではありません

Java.lang.IllegalArgumentException:x +幅は<= bitmap.width()でなければなりません

ヘレスは、トリミングを行い、一般的なケースのいくつかを処理する小さな関数です。

編集:ドロイドスターの主張に従って更新。

public static Bitmap cropToSquare(Bitmap bitmap){
    int width  = bitmap.getWidth();
    int height = bitmap.getHeight();
    int newWidth = (height > width) ? width : height;
    int newHeight = (height > width)? height - ( height - width) : height;
    int cropW = (width - height) / 2;
    cropW = (cropW < 0)? 0: cropW;
    int cropH = (height - width) / 2;
    cropH = (cropH < 0)? 0: cropH;
    Bitmap cropImg = Bitmap.createBitmap(bitmap, cropW, cropH, newWidth, newHeight);

    return cropImg;
}

解像度とサイズが異なるいくつかの画像を使用していくつかのテストを行いましたが、期待どおりに機能しました。

他の状況でも使用できます。たとえば、「完全に」丸い画像を作成しようとしていて、角張ったビットマップを渡す必要がある場合などです。

23
faustor21

固定画像ビューの高さと幅を設定し、2つのプロパティを画像ビューに設定する

Android:adjustViewBounds="true" 
Android:scaleType="centerCrop"

終わった

4
Gautam

今、xmlは次のようなプロパティを持っています

 custom:cropAspectRatioX="2"
    custom:cropAspectRatioY="1"

正方形のトリミングが必要な場合は、両方を1にします。今それは長方形です

アクティビティCropActivityを追加

       package agropost.post.agro.com.agropost.Activity;

    import Android.content.Intent;
    import Android.graphics.Bitmap;
    import Android.graphics.BitmapFactory;
    import Android.os.Bundle;
    import Android.support.v7.app.AppCompatActivity;
    import Android.util.DisplayMetrics;
    import Android.widget.Button;

    import com.theartofdev.edmodo.cropper.CropImageView;

    import agropost.post.agro.com.agropost.R;
    import agropost.post.agro.com.agropost.Utility.Constants;
    import butterknife.BindView;
    import butterknife.ButterKnife;
    import butterknife.OnClick;

    public class CropActivity extends AppCompatActivity {


        public static boolean isCrop = false;
        @BindView(R.id.img_crop)
        CropImageView imgCrop;
        @BindView(R.id.btn_done)
        Button btnDone;
        @BindView(R.id.btn_cancel)
        Button btnCancel;




        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_crop);
            ButterKnife.bind(this);


            DisplayMetrics displayMetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
            int width = displayMetrics.widthPixels;
            width = width - 80;
            imgCrop.getLayoutParams().height = width;
            imgCrop.getLayoutParams().width = width;

            imgCrop.setBackground(null);
            imgCrop.setScaleType(CropImageView.ScaleType.FIT_CENTER);



                imgCrop.setImageBitmap(Constants.mDashboardActivity.thumbnail_r);



        }

        @OnClick(R.id.btn_done)
        public void onViewClicked() {

            isCrop = true;
            Intent returnIntent = new Intent();



                Constants.mDashboardActivity.thumbnail_r = imgCrop.getCroppedImage();
                setResult(3, returnIntent);



            finish();
        }

        @OnClick(R.id.btn_cancel)
        public void onViewClickedCancel() {

            byte[] byteArray = getIntent().getByteArrayExtra("default");
            Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);


            Constants.mDashboardActivity.thumbnail_r = bmp;
            isCrop = true;
            Intent returnIntent = new Intent();
            setResult(3, returnIntent);

            finish();
        }


       @Override
        public void onBackPressed() {
            //  super.onBackPressed();


        }


    }

アクティビティのxml ..............

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@color/transparent"
    Android:gravity="center"
    Android:orientation="vertical"
    tools:context=".Activity.CropActivity">


    <com.theartofdev.edmodo.cropper.CropImageView xmlns:custom="http://schemas.Android.com/apk/res-auto"
        Android:id="@+id/img_crop"
        Android:layout_width="100dp"
        Android:layout_height="100dp"
        Android:background="@drawable/drawer_bg"
        Android:scaleType="centerInside"
        custom:cropAspectRatioX="2"
        custom:cropAspectRatioY="1"
        custom:cropFixAspectRatio="true"
        custom:cropShape="rectangle" />

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="horizontal">

        <Button
            Android:id="@+id/btn_done"
            Android:layout_width="match_parent"
            Android:layout_height="60dp"
            Android:layout_marginLeft="@dimen/margin_40"
            Android:layout_marginRight="@dimen/margin_20"
            Android:layout_marginTop="@dimen/margin_20"
            Android:layout_weight="1"
            Android:background="@drawable/btn_bg_green_rounded"
            Android:text="Done"
            Android:textColor="@color/colorWhite"

            Android:textSize="@dimen/fontsize_normal" />

        <Button
            Android:id="@+id/btn_cancel"
            Android:layout_width="match_parent"
            Android:layout_height="60dp"
            Android:layout_marginLeft="@dimen/margin_20"
            Android:layout_marginRight="@dimen/margin_40"
            Android:layout_marginTop="@dimen/margin_20"
            Android:layout_weight="1"
            Android:background="@drawable/btn_bg_green_rounded"
            Android:text="Cancel"
            Android:textColor="@color/colorWhite"
            Android:textSize="@dimen/fontsize_normal"

            Android:visibility="gone" />
    </LinearLayout>

</LinearLayout>

依存症を追加

      implementation 'com.theartofdev.edmodo:Android-image-cropper:2.4.+'
0
Pratibha Sarode