Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将位图转换为固定大小_Android_Image_Bitmap - Fatal编程技术网

Android 将位图转换为固定大小

Android 将位图转换为固定大小,android,image,bitmap,Android,Image,Bitmap,例如,我有一个10mb的图像;我想把它转换成300kb。我看过很多例子 使用 (此处将100更改为较小的值将减小大小,但如何使大小接近300-350kb) 及 我提供的地方 options.inSampleSize=5/*sample*/; 但不知何故,我错过了一些东西 更新 通过11mb到2mb的转换解决。如果我找到更好的方法,将进行更新。我认为因为PNG是无损的,所以质量参数没有效果。它不会“嘎吱”你的PNG。但是,这种方法适用于jpg: 尝试和错误,用a会让你很快接近,3-4次尝试可能取

例如,我有一个10mb的图像;我想把它转换成300kb。我看过很多例子 使用

(此处将100更改为较小的值将减小大小,但如何使大小接近300-350kb)

我提供的地方

options.inSampleSize=5/*sample*/;

但不知何故,我错过了一些东西

更新
通过11mb到2mb的转换解决。如果我找到更好的方法,将进行更新。

我认为因为PNG是无损的,所以质量参数没有效果。它不会“嘎吱”你的PNG。但是,这种方法适用于jpg:

尝试和错误,用a会让你很快接近,3-4次尝试可能取决于可接受范围的大小

int minQuality = 10;
int maxQuality = 100;
long size = 0;
while(true) {
  int mid = (maxQuality + minQuality)/2;        
  long size = compress(mid);

  if (size > minSize) { //too large
     if (maxQuality == minQuality){
       throw new RuntimeException("Cannot compress this image down in to this size range.");
     }
     maxQuality = mid - 1;
     continue;
  }

  if (size < maxSize) { //too small
     if(maxQuality == 100){
       break; //this means the image is smaller than the acceptable range even at 100
     }
     minQuality = mid + 1;
     continue;
  }

  break;//done, falls in range 
}
int minQuality=10;
int-maxQuality=100;
长尺寸=0;
while(true){
int mid=(最大质量+最小质量)/2;
长尺寸=压缩(中间);
如果(大小>最小大小){//太大
如果(maxQuality==minQuality){
抛出新的RuntimeException(“无法将此图像压缩到此大小范围内”);
}
maxQuality=mid-1;
继续;
}
如果(大小<最大大小){//太小
如果(maxQuality==100){
break;//这意味着图像小于可接受的范围,即使在100
}
minQuality=mid+1;
继续;
}
break;//完成,落在范围内
}
两个选项可用

  • 使用图像处理或android的某些图像处理api降低图像对比度,或使用图像处理api进行采样
  • 重复bmp.compress(Bitmap.CompressFormat.PNG,100,流);多次将图像存储在外部,每次再次读取

  • 我应该在哪里使用这种质量?在bitmap.compress中?如果是的话,那么我甚至使用了高达1%的质量,它返回的图像值200万字节,并不是每个图像都能压缩到您想要的大小。特别是巴布亚新几内亚。这时会抛出异常。我实际上认为quality参数对PNG没有影响,但上面的方法对JPG有效。是的,你是对的。。我刚刚回忆起来。巴布亚新几内亚是没有损失的。这段代码只是一个例子。让我来编辑这个问题。
    BitmapFactory.decodeFile(filePath, options);
    
    int minQuality = 10;
    int maxQuality = 100;
    long size = 0;
    while(true) {
      int mid = (maxQuality + minQuality)/2;        
      long size = compress(mid);
    
      if (size > minSize) { //too large
         if (maxQuality == minQuality){
           throw new RuntimeException("Cannot compress this image down in to this size range.");
         }
         maxQuality = mid - 1;
         continue;
      }
    
      if (size < maxSize) { //too small
         if(maxQuality == 100){
           break; //this means the image is smaller than the acceptable range even at 100
         }
         minQuality = mid + 1;
         continue;
      }
    
      break;//done, falls in range 
    }