Save/Read 内部存储中的位图不起作用
Save/Read Bitmap in internal storage doesn't work
我尝试编写一个简单的功能,在按下按钮后裁剪图像(存储在可绘制文件夹中),return 图像视图中第一个 Activity 中的裁剪图像。
在尝试通过无效的意图将位图传递到 arraybyte 之后,我现在试图将裁剪后的图像保存到内部存储中并在 OnActivityResult
函数中读取它,但是当我完成裁剪后我在我的 ImageView
.
中什么也得不到
对于裁剪,我使用了以下库:https://github.com/ArthurHub/Android-Image-Cropper/wiki
代码如下:
public class MainActivity extends AppCompatActivity {
Button b;
ImageView preview;
final int REQUEST_CODE_TEST = 63;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b = (Button) findViewById(R.id.chooser);
preview = (ImageView) findViewById(R.id.preview);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), Cropper.class);
startActivityForResult(intent, REQUEST_CODE_TEST);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_TEST && resultCode == RESULT_OK) {
try {
String path=data.getData().toString();
File f=new File(path,"profile.jpg");
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(f));
preview.setImageBitmap(bitmap);
}catch (Exception e){
e.printStackTrace();
}
}
}
农作物活动:
public class Cropper extends Activity {
CropImageView cropImageView;
Bitmap bitmap;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cropper);
bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.ic_bonnasse);
cropImageView=(CropImageView)findViewById(R.id.cropImageView);
cropImageView.setCropShape(CropImageView.CropShape.RECTANGLE);
cropImageView.setImageBitmap(bitmap);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
public void finish() {
super.finish();
Intent retour=new Intent();
Bitmap crop=cropImageView.getCroppedImage();
Bitmap out=Bitmap.createScaledBitmap(crop, 200, 200, true);
ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getDir("Profile_pic", Context.MODE_PRIVATE);
File mypath=new File(directory,"profile.jpg");
FileOutputStream outputStream=null;
try{
outputStream=new FileOutputStream(mypath);
out.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
outputStream.close();
}catch (Exception e){
e.printStackTrace();
}
retour.putExtra("directory",directory.getAbsolutePath());
}
感谢您的帮助。
当您完成裁剪 activity 时,您应该设置 parent activity 的结果状态,否则 parent activity无法检测到结果代码。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_TEST && resultCode == RESULT_OK) {
Bitmap bitmap = (Bitmap) data.getParcelableExtra("bitmap");
preview.setImageBitmap(bitmap);
}
在此图中,结果代码始终为 RESULT_CANCEL ,因此您的 If 块不会 运行.
解决方案:
不要重写 finish() 方法,只需使用它并在作物 activity 中使用它更改您的侦听器。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent retour=new Intent();
Bitmap crop = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
Bitmap out=Bitmap.createScaledBitmap(crop, 200, 200, true);
retour.putExtra("bitmap", out);
setResult(RESULT_OK, retour);
finish();
}
});
在这种情况下,我只是将位图传递给 main activity ,但是如果您愿意保存位图然后将其发送到 main activity ,您应该保存并放置它进入 retour.putExtra("directory",directory.getAbsolutePath());
在你的裁剪 activity 中,然后在 onActivityResult 中通过 String directory = data.getStringExtra("directory");
获取它。
虽然在我看来第一种方法更好,但您还有第二种方法。
我尝试编写一个简单的功能,在按下按钮后裁剪图像(存储在可绘制文件夹中),return 图像视图中第一个 Activity 中的裁剪图像。
在尝试通过无效的意图将位图传递到 arraybyte 之后,我现在试图将裁剪后的图像保存到内部存储中并在 OnActivityResult
函数中读取它,但是当我完成裁剪后我在我的 ImageView
.
对于裁剪,我使用了以下库:https://github.com/ArthurHub/Android-Image-Cropper/wiki
代码如下:
public class MainActivity extends AppCompatActivity {
Button b;
ImageView preview;
final int REQUEST_CODE_TEST = 63;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b = (Button) findViewById(R.id.chooser);
preview = (ImageView) findViewById(R.id.preview);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), Cropper.class);
startActivityForResult(intent, REQUEST_CODE_TEST);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_TEST && resultCode == RESULT_OK) {
try {
String path=data.getData().toString();
File f=new File(path,"profile.jpg");
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(f));
preview.setImageBitmap(bitmap);
}catch (Exception e){
e.printStackTrace();
}
}
}
农作物活动:
public class Cropper extends Activity {
CropImageView cropImageView;
Bitmap bitmap;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cropper);
bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.ic_bonnasse);
cropImageView=(CropImageView)findViewById(R.id.cropImageView);
cropImageView.setCropShape(CropImageView.CropShape.RECTANGLE);
cropImageView.setImageBitmap(bitmap);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
public void finish() {
super.finish();
Intent retour=new Intent();
Bitmap crop=cropImageView.getCroppedImage();
Bitmap out=Bitmap.createScaledBitmap(crop, 200, 200, true);
ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getDir("Profile_pic", Context.MODE_PRIVATE);
File mypath=new File(directory,"profile.jpg");
FileOutputStream outputStream=null;
try{
outputStream=new FileOutputStream(mypath);
out.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
outputStream.close();
}catch (Exception e){
e.printStackTrace();
}
retour.putExtra("directory",directory.getAbsolutePath());
}
感谢您的帮助。
当您完成裁剪 activity 时,您应该设置 parent activity 的结果状态,否则 parent activity无法检测到结果代码。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_TEST && resultCode == RESULT_OK) {
Bitmap bitmap = (Bitmap) data.getParcelableExtra("bitmap");
preview.setImageBitmap(bitmap);
}
在此图中,结果代码始终为 RESULT_CANCEL ,因此您的 If 块不会 运行.
解决方案:
不要重写 finish() 方法,只需使用它并在作物 activity 中使用它更改您的侦听器。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent retour=new Intent();
Bitmap crop = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
Bitmap out=Bitmap.createScaledBitmap(crop, 200, 200, true);
retour.putExtra("bitmap", out);
setResult(RESULT_OK, retour);
finish();
}
});
在这种情况下,我只是将位图传递给 main activity ,但是如果您愿意保存位图然后将其发送到 main activity ,您应该保存并放置它进入 retour.putExtra("directory",directory.getAbsolutePath());
在你的裁剪 activity 中,然后在 onActivityResult 中通过 String directory = data.getStringExtra("directory");
获取它。
虽然在我看来第一种方法更好,但您还有第二种方法。