8

在发布之前,我真的在整个网络上进行了搜索。我的问题是我无法在不丢失图像质量的情况下调整位图大小(质量非常差且像素化)。

我从相机中获取位图,然后我必须缩小它,这样我可以更快地将它上传到服务器。

这是进行采样的功能

public Bitmap resizeBitmap(Bitmap bitmap){
         Canvas canvas = new Canvas();
         Bitmap resizedBitmap = null;
         if (bitmap !=null) {
                int h = bitmap.getHeight();
                int w = bitmap.getWidth();
                int newWidth=0;
                int newHeight=0;

                if(h>w){
                    newWidth = 600;
                    newHeight = 800;
                }

                if(w>h){
                    newWidth = 800;
                    newHeight = 600;
                    }

                float scaleWidth = ((float) newWidth) / w;
                float scaleHeight = ((float) newHeight) / h;



                Matrix matrix = new Matrix();
                // resize the bit map
                matrix.preScale(scaleWidth, scaleHeight);

                resizedBitmap  = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);



                Paint paint = new Paint();
                paint.setAntiAlias(true);
                paint.setFilterBitmap(true);
                paint.setDither(true);

                canvas.drawBitmap(resizedBitmap, matrix, paint);



            }


        return resizedBitmap;   

这就是我从活动结果中获取图像的方式

 protected void onActivityResult(int requestCode, int resultCode,
             Intent data) {
         if(resultCode != RESULT_CANCELED){

         if (requestCode == 0) {
             if (resultCode == RESULT_OK) {


                    getContentResolver().notifyChange(mImageUri, null);
                    ContentResolver cr = this.getContentResolver();

                    try
                    {
                        b = android.provider.MediaStore.Images.Media.getBitmap(cr, mImageUri);
                        Log.d("foto", Integer.toString(b.getWidth()));
                        Log.d("foto", Integer.toString(b.getHeight()));
                        addPhoto.setImageBitmap(b);

                    }
                    catch (Exception e)
                    {
                        Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show();
                        Log.d("TAG", "Failed to load", e);
                    }



             }
         }

我开始认为获得小图片的最佳方法是设置相机分辨率。还有人可以帮忙吗?

4

4 回答 4

9

良好的缩小算法(不是最近邻)仅包含 2 个步骤(加上计算输入/输出图像裁剪的精确 Rect):

  1. 使用BitmapFactory.Options::inSampleSize->BitmapFactory.decodeResource()尽可能接近您需要的分辨率但不小于它的分辨率
  2. 通过使用Canvas::drawBitmap()缩小一点来获得精确的分辨率

以下是 SonyMobile 如何解决此任务的详细说明:http: //developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/

这是 SonyMobile scale utils 的源代码:http: //developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/

于 2014-04-21T01:59:47.100 回答
2

尝试下面提到的代码来调整位图大小。

 public Bitmap get_Resized_Bitmap(Bitmap bmp, int newHeight, int newWidth) {
        int width = bmp.getWidth();
        int height = bmp.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();
        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);

        // "RECREATE" THE NEW BITMAP
        Bitmap newBitmap = Bitmap.createBitmap(bmp, 0, 0, width, height, matrix, false);
        return newBitmap ;
    }

我用这段代码缩小了我的位图,它的质量,嗯..,是可以接受的。

希望这可以帮助。

于 2013-05-09T15:47:05.517 回答
1

尝试Bitmap.createScaledBitmap。它还具有过滤源的选项。

于 2013-05-09T15:42:28.467 回答
0

我遇到的最好的重新缩放方法使用的方法createScaledBitmap是根据位图高度和宽度以及缩放比例计算高度和宽度,因此不会丢失质量

 public Bitmap resize(Bitmap imaged, int maxWidth, int maxHeight) {
        Bitmap image = imaged;

        if (maxHeight > 0 && maxWidth > 0) {
            int width = image.getWidth();
            int height = image.getHeight();
            float ratioBitmap = (float) width / (float) height;
            float ratioMax = (float) maxWidth / (float) maxHeight;
            int finalWidth = maxWidth;
            int finalHeight = maxHeight;
            if (ratioMax > 1) {
                finalWidth = Math.round(((float) maxHeight * ratioBitmap));
            } else {
                finalHeight = Math.round(((float) maxWidth / ratioBitmap));
            }
            return image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, false);
        }
        return image;
    }

如何使用:

Bitmap resizedBitmap = resize(scrBitMap,640,640);
于 2020-11-12T09:44:13.727 回答