从相机裁剪中减少图像文件大小

时间:2017-06-30 20:14:52

标签: java android image bitmap base64

我正在尝试实现减少文件的最佳方法,基本上我的应用程序是关于植物,我需要高质量的图像,所以我做的第一件事是使用外部库来缩放缩略图(所以我可以保持宽高比)我使用1:1 thumnbnail格式。

每次我拍照并且如果在activityResult上一切正常,它会调用构建的裁剪库,这样我就可以剪切并获取uri,如下所示:

protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        dateTimer = getTime();

        Log.d("codig",String.valueOf(requestCode));

        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Log.d("resultOK","resultOK");
            CropImage.activity(data.getData())
                    .setAspectRatio(1,1)
                    .setInitialCropWindowPaddingRatio(0)
                    .setActivityTitle("Corte a foto")
                    .setActivityMenuIconColor(R.color.nephritis)
                    .setRequestedSize(300, 300, CropImageView.RequestSizeOptions.RESIZE_INSIDE)
                    .start(this);
        }
        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            if (resultCode == RESULT_OK) {
                Uri uri = result.getUri();
                Bitmap pic = null;
                try {
                    pic = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                path = saveToInternalStorage(pic);
                Log.d("caminho",path);
                showDetailsDialog(data);
            } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
                Exception error = result.getError();
                Log.d("pict12",error.toString());
            }
        }
    }

你们可以看到我在那里有一个setRequestSize方法,我减少了图像的大小(这有效,但有时候,我作为base64发送的文本仍然很大。

我将uri转换为位图并将其保存在设备文件中,在下一个活动中我获取文件

private String saveToInternalStorage(Bitmap bitmapImage){
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
        // path to /data/data/yourapp/app_data/imageDir
        File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
        // Create imageDir
        File mypath=new File(directory,"captured.jpg");

        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(mypath);
            // Use the compress method on the BitMap object to write image to the OutputStream
            bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return directory.getAbsolutePath();
    }

所以在接下来的活动中我会这样:

private void loadImageFromStorage(String path)
    {

        try {
            File f=new File(path, "captured.jpg");
            Log.d("filehe",f.toString());
            b = BitmapFactory.decodeStream(new FileInputStream(f));
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }

    }

我得到b(位图)并将他转换为byte []之后到base64(我的服务器请求的内容)

 byte[] capture = encodeImage(b);
        String encodedImage = Base64.encodeToString(capture,1);
        Log.d("encodedImage",encodedImage);

        params.put("base64", encodedImage);

这里的问题是我需要保持图像的质量,我不能在不增加服务器的重量的情况下获得质量,我不能以某种方式压缩它?我在文件上执行但不起作用

0 个答案:

没有答案