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

Posted

技术标签:

【中文标题】在内部存储中保存/读取位图不起作用【英文标题】:Save/Read Bitmap in internal storage doesn't work 【发布时间】:2016-08-20 09:21:12 【问题描述】:

我尝试编写一个简单的功能,在按下按钮后裁剪图像(存储在可绘制文件夹中),并在 imageView 的第一个 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());

感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

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

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()); 在您的作物活动中,然后在 onActivityResult 中通过String directory = data.getStringExtra("directory"); 获取它。

虽然在我看来第一种方式更好,但您还有第二种方式。

【讨论】:

非常感谢 但即使进行了更改,它仍然无法正常工作,图像不会出现在我的imageView 您可能还有第二个问题。您是否成功将裁剪后的位图保存在 sd 卡中? 问题是您在作物活动中投入了额外的精力,并将其投入到主要活动中。检查我已经编辑过的答案。

以上是关于在内部存储中保存/读取位图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android Java读取和保存数据不起作用

淘汰赛类绑定在组件中不起作用

localStorage UIWebView iPhone / iPad 保存或读取不起作用.. 有时?

Apache - 限制 IP 不起作用

从本地存储中检索数据不起作用

Django url 似乎不起作用