如何将最近保存的图片发送到ImageView?

时间:2017-11-08 10:42:50

标签: android android-camera

我已启动并运行相机,并将图片保存到手机中,但我现在想要将其显示在我已设置的ImageView中,然后在每次启动应用程序之后再次显示。关于如何扩展我已经实现的目标的任何建议?

我的相机代码如下:

private void takePic() {
    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    File pictureDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    String pictureName = "Avatar.jpg";
    File imageFile = new File(pictureDirectory, pictureName);
    Uri pictureUri = Uri.fromFile(imageFile);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
    startActivityForResult(cameraIntent, CAMERA_REQUEST);
}

我有一个按钮,只需拨打takePic()即可。之前我有onActivityResult()看起来像这样:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        AvatarMe.setImageBitmap(photo);
    }
}

我用它来简单地在我的ImageView中显示缩略图,但是当我修改代码以保存图片时我不得不将其删除,否则应用程序会崩溃。似乎Android不会让我同时做到这两点,所以我需要一些帮助来弄清楚我是如何做到的。

所以基本上我想拍照,在我的ImageView中显示它,并保存它,这样如果应用程序在拍完照片后被杀死,我可以用保存的图片填充ImageView。

4 个答案:

答案 0 :(得分:0)

您可以使用picasso库。

答案 1 :(得分:0)

在您的onActivityResult()数据来自意图,但您必须保存到内部存储空间并在imageview中显示,请查看。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE)
{
if (resultCode == Activity.RESULT_OK)
{
    Bitmap bmp = (Bitmap)data.getExtras().get("data");
    ByteArrayOutputStream stream = new ByteArrayOutputStream();

    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();

    //saving image into internal storage

    File myfile = new File(Environment.getExternalStorageDirectory(),"yourfilename.jpg");

    FileOutputStream fo;
    try {
        myfile.createNewFile();
        fo = new FileOutputStream(myfile);
        fo.write(byteArray);
        fo.flush();
        fo.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // convert byte array to Bitmap

    Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
            byteArray.length);

    imageView.setImageBitmap(bitmap);

}
}
}

快乐的编码!!

答案 2 :(得分:0)

你可以使用picasso library或者你可以使用我的方法来压缩图像和这个ImageCompression类 `

private Context context;
float maxHeight;
float maxWidth;
boolean wantSave;

public ImageCompression(Context context) {
    this.context = context;
}

public ImageCompression(Context context, float maxHeight, float maxWidth, boolean wantSave) {
    this.context = context;
    this.maxHeight = maxHeight;
    this.maxWidth = maxWidth;
    this.wantSave = wantSave;
}

@Override
protected Bitmap doInBackground(String... strings) {
    if (strings.length == 0 || strings[0] == null)
        return null;

    return compressImage(strings[0]);
}

protected void onPostExecute(Bitmap imagePath) {
    // imagePath is path of new compressed image.
}


public Bitmap compressImage(String imagePath) {
    // to check if image is exist or not
    File checkFile = new File(imagePath);
    if (!checkFile.exists()) {
        return null;
    }

    Bitmap scaledBitmap = null;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap bmp = BitmapFactory.decodeFile(imagePath, options);

    int actualHeight = options.outHeight;
    int actualWidth = options.outWidth;

    float imgRatio = (float) actualWidth / (float) actualHeight;
    float maxRatio = maxWidth / maxHeight;

    if (actualHeight > maxHeight || actualWidth > maxWidth) {
        if (imgRatio < maxRatio) {
            imgRatio = maxHeight / actualHeight;
            actualWidth = (int) (imgRatio * actualWidth);
            actualHeight = (int) maxHeight;
        } else if (imgRatio > maxRatio) {
            imgRatio = maxWidth / actualWidth;
            actualHeight = (int) (imgRatio * actualHeight);
            actualWidth = (int) maxWidth;
        } else {
            actualHeight = (int) maxHeight;
            actualWidth = (int) maxWidth;

        }
    }

    options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight);
    options.inJustDecodeBounds = false;
    options.inDither = false;
    options.inPurgeable = true;
    options.inInputShareable = true;
    options.inTempStorage = new byte[16 * 1024];

    try {
        bmp = BitmapFactory.decodeFile(imagePath, options);
        scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.RGB_565);

        float ratioX = actualWidth / (float) options.outWidth;
        float ratioY = actualHeight / (float) options.outHeight;
        float middleX = actualWidth / 2.0f;
        float middleY = actualHeight / 2.0f;

        Matrix scaleMatrix = new Matrix();
        scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

        Canvas canvas = new Canvas(scaledBitmap);
        canvas.setMatrix(scaleMatrix);

        if (bmp != null) {
            canvas.drawBitmap(bmp, middleX - bmp.getWidth() / 2, middleY - bmp.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));
            bmp.recycle();
        }

        ExifInterface exif;
        try {
            exif = new ExifInterface(imagePath);
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0);
            Matrix matrix = new Matrix();
            if (orientation == 6) {
                matrix.postRotate(90);
            } else if (orientation == 3) {
                matrix.postRotate(180);
            } else if (orientation == 8) {
                matrix.postRotate(270);
            }
            scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // these lines from 144 to 157 for save the new photo
        if (wantSave) {
            FileOutputStream out = null;
            String filepath = imagePath;
            try {
                out = new FileOutputStream(filepath);

                //write the compressed bitmap at the destination specified by filename.
                scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

        return scaledBitmap;

    } catch (OutOfMemoryError exception) {
        exception.printStackTrace();
    }
    return null;
}

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    final float totalPixels = width * height;
    final float totalReqPixelsCap = reqWidth * reqHeight * 2;

    while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {
        inSampleSize++;
    }
    return inSampleSize;
}

}

然后在onActivityResult调用

 ImageCompression imageCompression = new ImageCompression(context, imageHeight, imageHeight, false) {
        @Override
        protected void onPostExecute(Bitmap bitmab) {
            super.onPostExecute(bitmab);
                try {
                    if (imagePath != null) {
                        mCropImageView.setImageBitmap(bitmab);
                    }
                } catch (OutOfMemoryError error) {
                    Toast.makeText(CropImageActivity.this, "OutOfMemory, no space", Toast.LENGTH_SHORT).show();
                }
        }
    };
    imageCompression.execute(imagePath);

我希望这会有所帮助

答案 3 :(得分:0)

在这种情况下,摄像机意图的“数据”为空。您可以查看answer

要解决此问题,您必须将传递给相机意图全局的uri。

//make this a global variable
Uri pictureUri = Uri.fromFile(imageFile);

然后你可以像这样访问位图

void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK)
        {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), pictureUri);
            AvatarMe.setImageBitmap(bitmap);
        }
    }

您还可以使用db或共享首选项存储pictureUri,稍后再重复使用。