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