如何在whatsapp中对图像进行子采样/调整大小

时间:2015-12-18 07:49:17

标签: android android-imageview android-image android-bitmap

通过whatsapp发送图像时,您可以在图像视图中看到要发送的图像非常好地缩放

例如,我发送了两张图片给我的朋友

  • 第一张图片的尺寸: 1296像素 X 2304像素

  • 第二张图片的尺寸: 1920像素 X 1080像素

此图片太大,因此whatsapp必须先缩放它们才能在imageview中向我展示

  • 按照whatapp缩放后的第一张图片的尺寸 333像素 X 339像素

  • 按whatsapp缩放后第二张图片的尺寸 333像素 X 187像素

正如您所看到的,宽度相同,只有高度不同。我试图找出whatapp如何缩放这些图像,但是我的方法给了我一个与whatsapp的图像不同的图像

方法1

private void resizeImage(){

Uri selectedImage = imageReturnedIntent.getData();
                      d("image url is " + selectedImage);
                      InputStream imageStream = getContentResolver().openInputStream(selectedImage);
                       BitmapFactory.decodeStream(imageStream,null, options);
                      imageHeight = options.outHeight;
                      imageWidth = options.outWidth;

                      options.inSampleSize = calculateInSampleSize(options,reqWidth,reqHeight);
                      options.inJustDecodeBounds = false;
                      bitmap = BitmapFactory.decodeStream(imageStream,null, options);

}
private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth , int reqHeght){

    int height = options.outHeight;
    int width = options . outWidth;
    d("width is "+ width + " height is "+ height);
    d("required width is "+ reqWidth + " required height "+ reqHeght);
    int inSampleSize = 1;

    if(height > reqHeght || width > reqWidth){

        int heightRatio = Math.round((float)height/(float)reqHeght);
        d("height ratio is "+ heightRatio);

        int widthRatio = Math.round((float)width / (float) reqWidth);
        d("width ratio is "+widthRatio);

        inSampleSize = (heightRatio > widthRatio)? heightRatio :widthRatio;
    }
    d(" insample size is "+ inSampleSize);
    return inSampleSize;
}

使用上述方法输出第一张图片:较小(<333)宽度,非常大的高度(> 339.它是579 !!)

第二种方法

private Bitmap scaleToFitWidth(Bitmap b, int width){
  float factor = width/b.getWidth(); // width is 333

  return Bitmap.createScaledBitmap(b, width,(int)(b.getHeight() * factor),true)
}

第二种方法输出第一张图像:图像高度非常大!

问题有谁知道如何像whatapp一样非常好地扩展图像在所有设备上?(如果可能的话,我希望与whatsapp相同)

编辑:whatsapp图片

我的huawel手机

 image is huawel

三星平板电脑

image in samsung talet

2 个答案:

答案 0 :(得分:7)

您可以查看此代码,它可以按照您的需要WhatsApp Like Image Compression运行。此代码已根据我的用法进行了修改。 使用此代码将为您提供:

  • 100kb 附近的低尺寸图像,无需播放图像质量。
  • 高像素图像将缩小为 maxWidth maxHeight 而不会失去其原始质量。

原始文章:Loading images Super-Fast like WhatsApp

演示:

Original Image:尺寸 - 3.84Mb尺寸 - 3120 * 4160

Compressed Image:尺寸 - 157Kb尺寸 - 960 * 1280

修改1:您还可以制作扩展ImageView类的自定义Square ImageView SquareImageView

答案 1 :(得分:0)

  

如何对whatsapp中的图像进行二次采样/调整大小

  • 您只需使用Glide,即可完成以下操作。更换 值 500,500 ,具有您所需的图像质量。

    Glide.with(getApplicationContext())
                .load(uri)
                .asBitmap()
                .into(new SimpleTarget<Bitmap>(500, 500) {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
                        bitmap = resource;//this is the required bitmap
                        imageView.setImageBitmap(resource); 
                    }
                });
    
  • 如果要将位图保存为文件,请使用以下方法

      private File savebitmap(String filename) {
      String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
      OutputStream outStream = null;
    
      File file = new File(filename + ".png");
      if (file.exists()) {
         file.delete();
         file = new File(extStorageDirectory, filename + ".png");
         Log.e("file exist", "" + file + ",Bitmap= " + filename);
      }
      try {
         // make a new bitmap from your file
         Bitmap bitmap = BitmapFactory.decodeFile(file.getName());
    
         outStream = new FileOutputStream(file);
         bitmap.compress(Bitmap.CompressFormat.JPG, 100, outStream);
         outStream.flush();
         outStream.close();
      } catch (Exception e) {
         e.printStackTrace();
      }
      Log.e("file", "" + file);
      return file;
    

    }

  • 要在项目中加入Glide,请将以下内容添加到您的gradle中 文件

     repositories {
     mavenCentral() // jcenter() works as well because it pulls from Maven    Central
     }
    
     dependencies {
     compile 'com.github.bumptech.glide:glide:3.7.0'
     compile 'com.android.support:support-v4:19.1.0'
     }