Android cropped image quality issue

狂风中的少年 提交于 2019-12-11 14:48:32

问题


I am trying to save an image as cropped from android and then show it in my app. I am using the code below, but when I try to view the image in my app the image quality is not good as in the attached image. Am doing anything wrong? Any help would be great.

My code is:

dipToPixel = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());

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

if (requestCode == 1 && resultCode == getActivity().RESULT_OK && data != null) {

    picUri = data.getData();

    performCrop();

}


if (requestCode == 111 && resultCode == getActivity().RESULT_OK && data != null) {

        Bundle extras = data.getExtras();

        Bitmap bitmapImage = extras.getParcelable("data");

        tweetImage.setImageBitmap(bitmapImage);

        tweetImage.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            public boolean onPreDraw() {
                tweetImage.getViewTreeObserver().removeOnPreDrawListener(this);

                widthPixel = tweetImage.getMeasuredWidth();
                heightPixel = tweetImage.getMeasuredHeight();

                return true;

            }
        });

        System.out.println("photo added");

        addPhotoVar = 1;
        addPhotoBtn.setText("remove");


}

callbackManager.onActivityResult(requestCode, resultCode, data);


}


private void performCrop() {

try {

    //call the standard crop action intent (the user device may not support it)
    Intent cropIntent = new Intent("com.android.camera.action.CROP");
    //indicate image type and Uri
    cropIntent.setDataAndType(picUri, "image/*");
    //set crop properties
    cropIntent.putExtra("crop", "true");
    //indicate aspect of desired crop
    cropIntent.putExtra("aspectX", 1);
    cropIntent.putExtra("aspectY", 1);
    //indicate output X and Y

    cropIntent.putExtra("outputX", Math.round(screenWidth / dipToPixel)-10);
    cropIntent.putExtra("outputY", Math.round(screenWidth / dipToPixel)-10);
    //retrieve data on return
    cropIntent.putExtra("return-data", true);
    //start the activity - we handle returning in onActivityResult
    startActivityForResult(cropIntent, 111);
}
// respond to users whose devices do not support the crop action
catch (ActivityNotFoundException anfe) {
    // display an error message
    String errorMessage = "your device doesn't support the crop action!";
    Toast toast = Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_SHORT);
    toast.show();
}
}

Below is the code that I use the image and save to database:

                tweetImage.buildDrawingCache();
                bm = tweetImage.getDrawingCache();

                if (widthPixel < heightPixel) {

                    basePixel = widthPixel;

                }

                else {

                    basePixel = heightPixel;

                }


                if (basePixel > 768) {

                    widthRatio = (float) 768/basePixel;
                    heightRatio = (float) 768/basePixel;


                }

                else {

                    widthRatio = 1;
                    heightRatio = 1;

                }


                Bitmap bmResized = Bitmap.createScaledBitmap(bm,(int)(widthPixel*widthRatio), (int)(heightPixel*heightRatio), true);

                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bmResized.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                byteArray1 = stream.toByteArray();

                image1 = new ParseFile("profilePhoto.jpg", byteArray1, "image/jpg");

回答1:


Use this library, this library manage cropped image quality as well it keeps both image Crop Library




回答2:


Change :

bmResized.compress(Bitmap.CompressFormat.JPEG, 100, stream);

to :

bmResized.compress(Bitmap.CompressFormat.PNG, 100, stream);

Since JPEG format uses a lossy compression, you should use PNG to save the bitmap, if you don't want quality loss.

Also, you should avoid using com.android.camera.action.CROP intent as it doesn't exist on all the devices as explained here.

There are some alternatives listed on the above link, you may use one of them.




回答3:


Please refer this link :

https://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent.html

Here are some libraries to consider for image crop:

https://github.com/lvillani/android-cropimage
https://github.com/biokys/cropimage
https://github.com/MMP-forTour/cropimage (forked from the above one)
https://github.com/dtitov/pickncrop


来源:https://stackoverflow.com/questions/38367876/android-cropped-image-quality-issue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!