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);
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
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.
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é
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.+'