Android:将位图保存到外部存储器 [英] Android: Saving Bitmap to External Memory

查看:174
本文介绍了Android:将位图保存到外部存储器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在开展捕捉图像,裁剪图像,处理图像然后保存处理过的图像的项目。我的问题在于保存处理过的图像。我无法保存已处理的图像。对于捕获的每个图像,捕获的图像将显示在库中而不是处理后的图像中。我想因为捕获图像代码将图像保存到SD卡,我无法保存位图上的处理图像...我希望你能告诉我代码的问题是什么。顺便说一句,代码没有错误。

I'm currently working on a project of capturing an image, cropping the image, processing the image then saving the processed image. My problem lies in saving the processed image. I can't save the processed image. For every image that is captured, the captured image is being shown in the gallery instead of the processed image. I'm thinking that because the capturing image code saves the image to the SD card, I can't save the processed image that is on a bitmap... I hope you can enlighten me on what is the problem of my code. There is no error on the code by the way.

为了更具体一点,我正在使用的应用程序捕获图像然后裁剪图像。之后,该图像将显示在imageView中。处理后,它将再次显示在imageView中。当我将图像保存在外部存储器中时,没有任何反应...

To be a little more specific, the app I'm working with captures image then crops the image. After that image will be shown in imageView. When processed, it will be again shown in an imageView. when i get the image to save in the external storage, nothing happens...

以下是捕获和裁剪图像的代码

Here is the code for capturing and cropping the image

public class MainActivity extends Activity {

ImageView mainImageview;
Button mainButtonTakePhoto;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initializeControls();
}

private void initializeControls() {
    mainImageview = (ImageView)findViewById(R.id.imageView1);
    mainButtonTakePhoto = (Button)findViewById(R.id.button3);
    mainButtonTakePhoto.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick (View v) {
            /* create an instance of intent
             * pass action android.media.action.IMAGE_CAPTURE
             * as argument to launch camera */
            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
             /*create instance of File with name img.jpg*/
            File file = new File(Environment.getExternalStorageDirectory()+File.separator + "img.jpg");
            /*put uri as extra in intent object*/
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
            /*start activity for result pass intent as argument and request code */
            startActivityForResult(intent, 1);
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //if request code is same we pass as argument in startActivityForResult
    if(requestCode==1){
        //create instance of File with same name we created before to get image from storage
        File file = new File(Environment.getExternalStorageDirectory()+File.separator + "img.jpg");
        //Crop the captured image using an other intent
        try {
            /*the user's device may not support cropping*/
            cropCapturedImage(Uri.fromFile(file));
        }
        catch(ActivityNotFoundException aNFE){
            //display an error message if user device doesn't support
            String errorMessage = "Sorry - your device doesn't support the crop action!";
            Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
            toast.show();
        }
    }
    if(requestCode==2){
        //Create an instance of bundle and get the returned data
        Bundle extras = data.getExtras();
        //get the cropped bitmap from extras
        Bitmap thePic = extras.getParcelable("data");
        //set image bitmap to image view
        mainImageview.setImageBitmap(thePic);
    }
}
//create helping method cropCapturedImage(Uri picUri)
public void cropCapturedImage(Uri picUri){
    //call the standard crop action intent
    Intent cropIntent = new Intent("com.android.camera.action.CROP");
    //indicate image type and Uri of image
    cropIntent.setDataAndType(picUri, "image/*");
    //set crop properties
    cropIntent.putExtra("crop", "true");
    //indicate aspect of desired crop
    cropIntent.putExtra("aspectX", 0);
    cropIntent.putExtra("aspectY", 0);
    //indicate output X and Y
    cropIntent.putExtra("outputX", 128);
    cropIntent.putExtra("outputY", 256);
    //retrieve data on return
    cropIntent.putExtra("return-data", true);
    //start the activity - we handle returning in onActivityResult
    startActivityForResult(cropIntent, 2);
}
}

这是保存图像的代码。

    public void saveImageToExternalStorage(Bitmap finalBitmap) {
    String root =Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
    File myDir = new File(root + "/saved_images");
    myDir.mkdirs();
    Random generator = new Random();
    int n = 10000;
    n = generator.nextInt(n);
    String fname = "Image-" + n + ".jpg";
    File file1 = new File(myDir, fname);
    if (file1.exists())
        file1.delete();
    try {
        FileOutputStream out = new FileOutputStream(file1);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }


    // Tell the media scanner about the new file so that it is
    // immediately available to the user.
    MediaScannerConnection.scanFile(this, new String[] { file1.toString() },                null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });

}

非常感谢您的帮助。如果这是一个愚蠢的问题,我试图不要麻烦任何人。我正在努力研究和研究我正在使用/提升的代码的每一部分...再次感谢...

Thanks a lot for your help. I'm trying not to trouble anyone if this is a stupid question. And I'm really trying my best to research and study every part of the code I'm using/lifting... Thanks again...

推荐答案

你是在api23及以上测试吗?如果是这样......您是否手动请求WRITE_EXTERNAL_STORAGE的权限?因为将它放入清单是不够的。

Are you testing it on api23 and up? If so... are you manually requesting permission to WRITE_EXTERNAL_STORAGE? because putting it in manifest is not enough.

这篇关于Android:将位图保存到外部存储器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆