Androidオリジナルカット方式を呼び出して画像を切り取り保存
文書ディレクトリ前言 一、ピクチャの取得方法 1.カメラ方式によるインスタント撮影 2.アルバム方式で写真 を選択
二、選択した写真を取得して切り出す 1.カメラが撮影した写真 を取得 2.選択した写真 を取得 3.クロップを呼び出すと に戻ります. 4.システムを呼び出して画像を切り取った後、 に戻る. 5.切り取った画像を指定ファイル に保存する.
三、注意事項 まとめ 前言
Androidはオリジナルのトリミング方式を提供し、トリミング後のリソースを対応するディレクトリに出力します.主に2つの方法があります.次に、この2つの方法を見てみましょう.
Android 10はパーティションストレージを提案しているので、ここではパーティションストレージをしばらく使用しないように、android:r e q u s t LegacyExternalStorage="true"のような構成で従来のストレージ方式を使用する、またAndroid 7.0対はアクセスロジックの必要性をUriで制限、Providerを構成してuriを作成してFileProviderを使用する必要がある.getUriForFile().
一、画像の取得方法
1.カメラ方式でインスタント撮影
2.アルバム方式で写真を選ぶ
二、選択した写真を取得して切り取る
1.カメラで撮影した写真を取得する
コードは次のとおりです.
2.選択した写真を取得
コードは次のとおりです.
3.クリップを呼び出して戻る
コードは次のとおりです.
4.システムを呼び出して画像を切り取って戻る
コードは次のとおりです.
5.切り取った画像を指定ファイルに保存する
###切り取り時に出力パスが設定されていない場合、Bitmapに戻るとBitmapを指定ファイルに出力できます.
コードは次のとおりです.
三、注意事項
次の点に注意してください.
outputXとoutputYは0にできず、手が0にサポートされていない場合があります.outputXとoutputYはあまり大きく設定できません.私のdemoでは300しか設定されていませんが、一部の携帯電話では600を設定するとシステム層にOOM現象が発生します.return-data属性値はtrueのみで、データは返されません.URIオブジェクトの取得には以下のコードが必要です
書くなら
データが返されない場合があります.
まとめ
以上、Androidシステムのトリミングについてですが、エラーがあれば、ご指摘ください!!!優秀な記事を参照: https://www.jianshu.com/p/3b92a0e30828 https://www.jianshu.com/p/c6271f5dad46 https://links.jianshu.com/go?to=https%3A%2F%2Fsegmentfault.com%2Fq%2F1010000005070720%2Fa-1020000005071373
Androidはオリジナルのトリミング方式を提供し、トリミング後のリソースを対応するディレクトリに出力します.主に2つの方法があります.次に、この2つの方法を見てみましょう.
Android 10はパーティションストレージを提案しているので、ここではパーティションストレージをしばらく使用しないように、android:r e q u s t LegacyExternalStorage="true"のような構成で従来のストレージ方式を使用する、またAndroid 7.0対はアクセスロジックの必要性をUriで制限、Providerを構成してuriを作成してFileProviderを使用する必要がある.getUriForFile().
一、画像の取得方法
1.カメラ方式でインスタント撮影
/**
*
*/
private void getPicFromCamera() {
//
tempFile = new File(Environment.getExternalStorageDirectory().getPath(), System.currentTimeMillis() + ".jpg");
//
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Android7.0 , FileProvider Uri
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(MainActivity.this,
this.getPackageName() + ".fileprovider", tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
} else {
// Uri.fromFile(file) Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
}
startActivityForResult(intent, CAMERA_REQUEST_CODE);
}
2.アルバム方式で写真を選ぶ
/**
*
*/
private void getPicFromAlbm() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, ALBUM_REQUEST_CODE);
}
二、選択した写真を取得して切り取る
1.カメラで撮影した写真を取得する
コードは次のとおりです.
case CAMERA_REQUEST_CODE: //
if (resultCode == RESULT_OK) {
// Uri
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri contentUri = FileProvider.getUriForFile(MainActivity.this,
this.getPackageName() + ".fileprovider", tempFile);
cropPhoto(contentUri);
} else {
cropPhoto(Uri.fromFile(tempFile));
}
}
break;
2.選択した写真を取得
コードは次のとおりです.
case ALBUM_REQUEST_CODE: //
if (resultCode == RESULT_OK) {
Uri uri = intent.getData();
cropPhoto(uri);
}
break;
3.クリップを呼び出して戻る
コードは次のとおりです.
case CROP_REQUEST_CODE: //
if (intent == null) {
return;
}
Bundle bundle = intent.getExtras();
if (bundle != null) {
// Bitmap ,
Bitmap image = bundle.getParcelable("data");
// ImageView
mHeader_iv.setImageBitmap(image);
// 、
// String path = saveImage("head_output", image);
// Log.d("dsadsadsa",path);
}
break;
4.システムを呼び出して画像を切り取って戻る
コードは次のとおりです.
/**
*
* * https://www.jianshu.com/p/3b92a0e30828
*/
private void cropPhoto(Uri uri) {
// 7.0 , “ ”
// , 7.0 uri , FileProvider,
//Uri.fromFile(file) , FileProvider.getUriForFile
//intent.putExtra("set-as-wallpaper",true); false, true , , 。
// intent.putExtra("return-data", true); bitmap
// if (data != null && data.getParcelableExtra("data") != null) {
// mStream = new ByteArrayOutputStream();
// mBitmap = data.getParcelableExtra("data");
// mBitmap.compress(Bitmap.CompressFormat.PNG, 100, mStream);
// /** */
// /** */
// File files = creatFile(mBitmap);//
// ... ...
//}
Uri contentUri = Uri.fromFile(new File(getPhotoPath()));
Intent intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//Android 7.0 Url , : :
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");// ,
intent.putExtra("scale", true);//
intent.putExtra("scaleUpIfNeeded", true);//
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 。
// , 。
intent.putExtra("outputX", 300);// , 。
intent.putExtra("outputY", 300);// 1:1 , 800*400, 2:1 ,
intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());//
intent.putExtra("return-data", true);// Bitmap
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);//
startActivityForResult(intent, CROP_REQUEST_CODE);
}
5.切り取った画像を指定ファイルに保存する
###切り取り時に出力パスが設定されていない場合、Bitmapに戻るとBitmapを指定ファイルに出力できます.
コードは次のとおりです.
public String saveImage(String name, Bitmap bmp) {
File appDir = new File( );
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = name + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
return file.getAbsolutePath();
} catch (IOException e) {
Log.d("dsadsadsa", e.getLocalizedMessage());
e.printStackTrace();
}
return null;
}
三、注意事項
次の点に注意してください.
outputXとoutputYは0にできず、手が0にサポートされていない場合があります.outputXとoutputYはあまり大きく設定できません.私のdemoでは300しか設定されていませんが、一部の携帯電話では600を設定するとシステム層にOOM現象が発生します.return-data属性値はtrueのみで、データは返されません.URIオブジェクトの取得には以下のコードが必要です
Uri.fromFile(new File(crop_path))
書くなら
Uri.parse(crop_path)
データが返されない場合があります.
まとめ
以上、Androidシステムのトリミングについてですが、エラーがあれば、ご指摘ください!!!優秀な記事を参照: