在内部存储中保存/读取位图不起作用



我尝试编写一个简单的功能,可以在按下按钮后裁剪图像(存储在drawable文件夹中),并在imageView的第一个Activity中返回裁剪的图像。在试图通过一个不工作的意图通过数组字节传递位图后,我现在试图将裁剪的图像保存到内部存储中并在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());
}

谢谢你的帮助。

当你完成裁剪活动时,你应该为你的父活动设置结果状态,否则父活动无法检测结果代码。

@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()方法,只需使用它并在crop活动中使用它更改侦听器。

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();
        }
    });

在这种情况下,我只是将位图传递到主活动,但如果你愿意保存位图,然后将其发送到主活动,你应该保存它并将其放入retour.putExtra("directory",directory.getAbsolutePath());在你的作物活动,然后得到它的String directory = data.getStringExtra("directory");在onActivityResult。

虽然我认为第一种方法更好,但你还有第二种方法。

最新更新