web-dev-qa-db-fra.com

Recadrer l'image au carré - Android

Comment puis-je couper une image rectangulaire (600 x 300) à gauche et à droite pour correspondre au carré ImageView? Je ne veux pas redimensionner une image, je veux juste la recadrer, pour être au format 300 x 300.

[SOLUTION]

Comme @blackbelt a dit

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

est idéal pour le recadrage des images. Alors, comment pouvez-vous recadrer automatiquement des images avec différentes tailles. Je crée ce code simple pour ça:

// 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);
17
KiKo

Vous pouvez utiliser 

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

de la documentation:

Renvoie un bitmap immuable à partir du sous-ensemble spécifié de la source bitmap. Le nouveau bitmap peut être le même objet que la source ou une copie peut ont été faites. Il est initialisé avec la même densité que le bitmap d'origine.

Ici vous pouvez trouver la documentation

3
Blackbelt

Développer un peu la réponse ci-dessus

Comme dans certaines situations, vous pouvez vous retrouver avec unexceptionoupas le résultat attendu, en utilisant simplement Bitmap.createBitmap (), comme le suivant:

Java.lang.IllegalArgumentException: x + width doit être <= bitmap.width ()

Heres est une petite fonction qui s'occupe de la récolte et gère certains cas communs. 

Edit: mis à jour conformément à la demande de droidster.

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;
}

J'ai fait plusieurs tests avec des images de différentes résolutions et tailles et tout s'est déroulé comme prévu.

Il peut également être utilisé dans d'autres situations, par exemple lorsque vous essayez de créer une image parfaitement "arrondie" et que vous devez transmettre une image bitmap carrée, etc.

21
cass_

définir une hauteur et une largeur de vue d'image fixes et définir deux propriétés pour la vue d'image

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

terminé

4
Gautam

Maintenant XML a des propriétés comme

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

Faites les deux 1 si vous voulez un carré. maintenant c'est du rectangle

Ajouter une activité 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 d'activité ..............

    <?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>

ajouter de la dépendance

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