如何把一张特别大的图片,分成几十张小的图片,在最短的时间内给处理?
来源:互联网 发布:手机机器人聊天软件 编辑:程序博客网 时间:2024/04/30 04:56
方法1:如果你将return-data设置为“true”,你将会获得一个与内部数据关联的Action,并且bitmap以此方式返回:(Bitmap)extras.getParcelable("data")。注意:如果你最终要获取的图片非常大,那么此方法会给你带来麻烦,所以你要控制outputX和outputY保持在较小的尺寸。鉴于此原因,在我的代码中没有使用此方法((Bitmap)extras.getParcelable("data"))。
下面是CropImage.java的源码片段:
// Return the cropped image directly or save it to the specified URI.
Bundle myExtras = getIntent().getExtras();
if (myExtras != null && (myExtras.getParcelable("data") != null || myExtras.getBoolean("return-data")))
{
Bundle extras = new Bundle();
extras.putParcelable("data", croppedImage);
setResult(RESULT_OK,(new Intent()).setAction("inline-data").putExtras(extras));
finish();
}
方法2: 如果你将return-data设置为“false”,那么在onActivityResult的Intent数据中你将不会接收到任何Bitmap,相反,你需要将MediaStore.EXTRA_OUTPUT关联到一个Uri,此Uri是用来存放Bitmap的。
但是还有一些条件,首先你需要有一个短暂的与此Uri相关联的文件地址,当然这不是个大问题(除非是那些没有sdcard的设备)。
下面是CropImage.java关于操作Uri的源码片段:
if (mSaveUri != null) {
OutputStream outputStream = null;
try {
outputStream = mContentResolver.openOutputStream(mSaveUri);
if (outputStream != null) {
croppedImage.compress(mOutputFormat, 75, outputStream);
}
} catch (IOException ex) {
// TODO: report error to caller
Log.e(TAG, "Cannot open file: " + mSaveUri, ex);
} finally {
Util.closeSilently(outputStream);
}
Bundle extras = new Bundle();
setResult(RESULT_OK, new Intent(mSaveUri.toString()).putExtras(extras));
}
代码示例:
我已经附上了一些代码示例,应该可以让你测试多种配置。请让我知道它对你是否有用。
代码下载: MediaStoreTest
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2012年资料/11月/11日/如何使用Android MediaStore裁剪大图片
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
thiz = this;
setContentView(R.layout.main);
mBtn = (Button) findViewById(R.id.btnLaunch);
photo = (ImageView) findViewById(R.id.imgPhoto);
mBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
// Launch picker to choose photo for selected contact
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", scale);
intent.putExtra("return-data", return_data);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());
intent.putExtra("outputFormat",
Bitmap.CompressFormat.JPEG.toString()); <span style="color: rgb(72, 70, 90); line-height: normal; font-family: monospace; font-size: 11px; background-color: rgb(239, 239, 239);"> // lol, negative boolean noFaceDetection</span> intent.putExtra("noFaceDetection", !faceDetection);
if (circleCrop) {
intent.putExtra("circleCrop", true);
}
startActivityForResult(intent, PHOTO_PICKED);
} catch (ActivityNotFoundException e) {
Toast.makeText(thiz, R.string.photoPickerNotFoundText,
Toast.LENGTH_LONG).show();
}
}
});
}
private Uri getTempUri() {
return Uri.fromFile(getTempFile());
}
private File getTempFile() {
if (isSDCARDMounted()) {
File f = new File(Environment.getExternalStorageDirectory(),
TEMP_PHOTO_FILE);
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(thiz, R.string.fileIOIssue, Toast.LENGTH_LONG)
.show();
}
return f;
} else {
return null;
}
}
private boolean isSDCARDMounted() {
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED))
return true;
return false;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PHOTO_PICKED:
if (resultCode == RESULT_OK) {
if (data == null) {
Log.w(TAG, "Null data, but RESULT_OK, from image picker!");
Toast t = Toast.makeText(this, R.string.no_photo_picked,
Toast.LENGTH_SHORT);
t.show();
return;
}
final Bundle extras = data.getExtras();
if (extras != null) {
File tempFile = getTempFile();
// new logic to get the photo from a URI
if (data.getAction() != null) {
processPhotoUpdate(tempFile);
}
}
}
break;
}
}
- 如何把一张特别大的图片,分成几十张小的图片,在最短的时间内给处理?
- 把一张特别大的图片,分成几十张小的图片,在最短的时间内给处理?
- 如何把多张图片合在一张图片里面显示?这里来个python + opencv的版本
- 如何让APP在最短的时间内成功上线?
- 如何让APP在最短的时间内上线
- Relative布局,一张图片在另一张上面的效果
- 如何在PPT中实现多张图片叠加在一起,点击消失一张出来下一张的效果
- 用QImage创建合成的图片(一张图片堆叠在另一张图片上)
- 如何把一张图片上的几个小图片按自己的要求有规律的显示出来
- 在程序中如何把两张图片合成为一张图片
- 在程序中如何把两张图片合成为一张图片
- 如何在最短的时间内打造一支战斗力极强的团队
- OpenCV两张图片叠加,一张旋转一定的角度,另一张不变,如何叠加?
- 各大论坛最具影响力的20张图片
- 如何在最短的时间内理解Java中的动态代理?
- 把一张图片改成不同的样式
- Qt-Quick中设置组件风格、显示一张图片、在一行显示多张图片的方法、绘制图片方法...
- Android Retrofit 2.0框架上传图片解决方案(一张与多张的处理)
- Java中的mysql事务处理
- 手把手教你使用UICollectionView写公司的项目
- JavaScript趣题:循环计数器
- 基线安全与linux基线加固方法
- POJ2033 动态规划
- 如何把一张特别大的图片,分成几十张小的图片,在最短的时间内给处理?
- Spring Boot+JPA+Mysql+ThymeLeaf快速构建CURD系统(三)构建后端
- ThinkPHP编程
- 【多线程】——join、yield、wait、sleep的区别
- iOS动画详解(学习动画看这一篇就够了)
- 架构师—硬件方案
- 给Java程序猿们推荐一些值得一看的好书
- 软件质量基础知识
- JavaSE整体知识框架图: