Image View realizes image clipping and display
First, set the button and an Image View in the layout layout
<Button
android:id="@+id/selectimagebtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Select pictures" />
<Button
android:id="@+id/cutimagebtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Select pictures for clipping" />
<!-- Information for displaying pictures -->
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Write code on Activity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button selectImageBtn, cutImageBtn;
private ImageView imageView;
// Declare two static integer variables, mainly for the return flag of intent
private static final int IMAGE_SELECT = 1;// Select pictures
private static final int IMAGE_CUT = 2;// Cut pictures
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
selectImageBtn = (Button) findViewById(R.id.selectimagebtn);
cutImageBtn = (Button) findViewById(R.id.cutimagebtn);
imageView = (ImageView) findViewById(R.id.imageview);
// Registered Monitoring Event
selectImageBtn.setOnClickListener(this);
cutImageBtn.setOnClickListener(this);
}
Implementation of OnClickListener and Method of Setting up Clipping Pictures
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.selectimagebtn:
//How to extract the picture library of mobile phone and select pictures
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//Open the Photo Gallery of Mobile Phone
startActivityForResult(intent, IMAGE_SELECT);
break;
case R.id.cutimagebtn:
Intent intent2 = getImageClipIntent();
startActivityForResult(intent2, IMAGE_CUT);
}
}
private Intent getImageClipIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);//No URL specified
//In order to realize the clipping of pictures, it is necessary to set the attributes and sizes of pictures.
intent.setType("image/*");//Get any image type Set an explicit MIME data type. Each MIME type consists of two parts. The first is a large category of data, such as audio, image, etc., and the latter defines a specific category.
intent.putExtra("crop", "true");//Slide Select Picture Area
intent.putExtra("aspectX", 1);//Represents the effect of a ratio of 1:1 for a clipping box
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 80);//Specify the size of the output picture
intent.putExtra("outputY", 80);
intent.putExtra("return-data", true);//Return value
return intent;
}
If you want to get the data returned after the closure of the newly opened Activity in Activity, you need to open the new Activity using the Start Activity ForResult (Intent intent, int request Code) method provided by the system. After the closure of the new Activity, the data will be returned to the front Activity. In order to get the data returned, you must override the onActivity Result (int request Code) in the previous Activity. Int resultCode, Intent data) method
When the new Activity is closed, the data returned by the new Activity is transferred through Intent. The Android platform calls the onActivityResult() method of the previous Activity, and the Intent storing the returned data is passed in as the third input parameter. The data returned by the new Activity can be retrieved by using the third input parameter in the onActivityResult() method.
If data or results need to be returned, start Activity ForResult (Intent intent, intrequestCode) is used, and the value of requestCode is self-defined to identify the target activity of the jump.
Overlay onActivityResult Method
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
//Processing pictures and displaying them according to the screen size of the mobile phone
if (requestCode == IMAGE_SELECT) {
Uri uri = data.getData();//Path to Get Pictures
Display display = getWindowManager().getDefaultDisplay();
Point point = new Point();
display.getSize(point);
int width = point.x;//Get the width of the screen
int height = point.y ;//Screen height
try {
//The class that implements image clipping is an anonymous inner class
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
//Matching the width and height of the picture to the screen of the mobile phone
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
//If greater than 1, the height of the picture is greater than the height of the mobile screen.
int hRatio = (int) Math.ceil(options.outHeight / (float) height);//(int) Math.ceil is down-rounding
//If greater than 1, the width of the picture is larger than the width of the mobile screen.
int wRatio = (int) Math.ceil(options.outWidth / (float) width);
//If hRatio or wRatio is greater than 1, zoom the image to 1/radio size and 1/radio^2 pixels
if (hRatio > 1 || wRatio > 1) {
if (hRatio > wRatio) {
options.inSampleSize = hRatio;
} else {
options.inSampleSize = wRatio;
}
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
imageView.setImageBitmap(bitmap);
}else{
//If hRatio and wRatio are 0, direct output
imageView.setImageBitmap(bitmap);
}
} catch (Exception e) {
}
//Represents clipped pictures
} else if (requestCode == IMAGE_CUT) {
Bitmap bitmap = data.getParcelableExtra("data");
imageView.setImageBitmap(bitmap);
}
}
}
options.inJustDecodeBounds = false/true;
Let's parse a picture. If it's too big, it's OOM. We can set the compression ratio in SampleSize, but how much is the problem. So we can parse the picture in two steps. The first step is to get the width of the picture. Here we set Options. In JustDecodeBounds = true. At this time, the bitmap of decode is null, just the width of the picture. Put it in Options.
Then the second step is to set the appropriate compression ratio inSampleSize, inSampleSize to the original 1/ratio, then get the appropriate Bitmap.
Set options.inJustDecodeBounds = false; re-read the picture bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);