如何将 URI 转换为位图?
How to convert URI to bitmap?
我正在制作一个图像滤镜应用程序,在应用滤镜之前我会将图像裁剪为正方形,我可以像这样使用 Soundcloud 库裁剪图像:-
private void beginCrop(String sources) {
img_name = "cropped"+System.currentTimeMillis();
Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped"+System.currentTimeMillis()));
Uri source = Uri.parse("file://"+sources);
Crop.of(source, destination).withAspect(200,200).start(this);
}
private void handleCrop(int resultCode, Intent result) {
if (resultCode == RESULT_OK) {
Toast.makeText(this,Crop.getOutput(result).toString(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(AlbumActivity.this,FilterImageActivity
.class);
intent.putExtra("output_image",Crop.getOutput(result).toString());
startActivity(intent);
} else if (resultCode == Crop.RESULT_ERROR) {
Toast.makeText(this, Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show();
}
}}
下一个 Activity 即 FilterImageActivity.java:-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filter_image);
String uri = getIntent().getStringExtra("output_image");
setImageDir(uri);
}
和函数setImageDir():-
private void setImageDir(String uri)
{
Bitmap bitmap = convetBitmap(uri);
// clear bitmap memory
/* originalImage.recycle();
finalImage.recycle();
finalImage.recycle();*/
originalImage = bitmap.copy(Bitmap.Config.ARGB_8888, true);
filteredImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
finalImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
imagePreview.setImageBitmap(originalImage);
bitmap.recycle();
// render selected image thumbnails
filtersListFragment.prepareThumbnail(originalImage);
}
和函数 convertBitmap():-
private Bitmap convetBitmap(final String uri)
{
final Bitmap[] bitmap = {null};
Thread task = new Thread()
{
@Override
public void run()
{
try {
bitmap[0] = Glide.with(getApplicationContext()).asBitmap().load(Uri.parse(uri)).into(100,100).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
};
task.start();
return bitmap[0];
}
例如图像被裁剪并保存到目录
file:///data/user/0/com.dev.pigeon/cache/cropped1518332591373
但是报错
Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.Bitmap.copy(android.graphics.Bitmap$Config, boolean)' on a null object reference
可能是 URI 没有转换成位图,请问有什么解决办法吗???
要将 URI 转换为位图,您可以执行以下操作。
try {
if( Uri.parse(paths)!=null ){
Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
}
catch (Exception e) {
//handle exception
}
当您获取文件表单文件选择器或相机意图时,您可以执行此操作。
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
Uri imageUri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
}
}
我正在制作一个图像滤镜应用程序,在应用滤镜之前我会将图像裁剪为正方形,我可以像这样使用 Soundcloud 库裁剪图像:-
private void beginCrop(String sources) {
img_name = "cropped"+System.currentTimeMillis();
Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped"+System.currentTimeMillis()));
Uri source = Uri.parse("file://"+sources);
Crop.of(source, destination).withAspect(200,200).start(this);
}
private void handleCrop(int resultCode, Intent result) {
if (resultCode == RESULT_OK) {
Toast.makeText(this,Crop.getOutput(result).toString(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(AlbumActivity.this,FilterImageActivity
.class);
intent.putExtra("output_image",Crop.getOutput(result).toString());
startActivity(intent);
} else if (resultCode == Crop.RESULT_ERROR) {
Toast.makeText(this, Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show();
}
}}
下一个 Activity 即 FilterImageActivity.java:-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filter_image);
String uri = getIntent().getStringExtra("output_image");
setImageDir(uri);
}
和函数setImageDir():-
private void setImageDir(String uri)
{
Bitmap bitmap = convetBitmap(uri);
// clear bitmap memory
/* originalImage.recycle();
finalImage.recycle();
finalImage.recycle();*/
originalImage = bitmap.copy(Bitmap.Config.ARGB_8888, true);
filteredImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
finalImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
imagePreview.setImageBitmap(originalImage);
bitmap.recycle();
// render selected image thumbnails
filtersListFragment.prepareThumbnail(originalImage);
}
和函数 convertBitmap():-
private Bitmap convetBitmap(final String uri)
{
final Bitmap[] bitmap = {null};
Thread task = new Thread()
{
@Override
public void run()
{
try {
bitmap[0] = Glide.with(getApplicationContext()).asBitmap().load(Uri.parse(uri)).into(100,100).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
};
task.start();
return bitmap[0];
}
例如图像被裁剪并保存到目录
file:///data/user/0/com.dev.pigeon/cache/cropped1518332591373
但是报错
Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.Bitmap.copy(android.graphics.Bitmap$Config, boolean)' on a null object reference
可能是 URI 没有转换成位图,请问有什么解决办法吗???
要将 URI 转换为位图,您可以执行以下操作。
try {
if( Uri.parse(paths)!=null ){
Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
}
catch (Exception e) {
//handle exception
}
当您获取文件表单文件选择器或相机意图时,您可以执行此操作。
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
{
Uri imageUri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
}
}