java Android:在不降低质量的情况下调整位图大小
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16465686/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android: Resizing Bitmaps without losing quality
提问by Vahn84
i've really searched through over the entire web before posting. My problem is that i cannot resize bitmap without losing the quality of the image (the quality is really bad and pixelated).
在发布之前,我真的在整个网络上进行了搜索。我的问题是我无法在不损失图像质量的情况下调整位图大小(质量非常差且像素化)。
I take the bitmap from camera and then i have to downscale it, so i can upload it to the server much faster.
我从相机中获取位图,然后我必须缩小它的比例,这样我就可以更快地将它上传到服务器。
This is the function that does the sampling
这是进行采样的函数
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;
and this is how i get the image from activity result
这就是我从活动结果中获取图像的方式
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);
}
}
}
I'm starting to think that the best way to get a small picture size is to set the camera resolution. Anyone else can help?
我开始认为获得小尺寸图片的最佳方法是设置相机分辨率。还有其他人可以帮忙吗?
采纳答案by Mena
Try Bitmap.createScaledBitmap. It also has an option to filter the source.
试试Bitmap.createScaledBitmap。它还具有过滤源的选项。
回答by goRGon
Good downscaling algorithm (not nearest neighbor like) consists of just 2 steps (plus calculation of the exact Rect for input/output images crop):
好的缩小算法(不是最近邻算法)只包含 2 个步骤(加上输入/输出图像裁剪的精确 Rect 计算):
- downscale using BitmapFactory.Options::inSampleSize->BitmapFactory.decodeResource()as close as possible to the resolution that you need but not less than it
- get to the exact resolution by downscaling a little bit using Canvas::drawBitmap()
- 使用BitmapFactory.Options::inSampleSize->BitmapFactory.decodeResource()尽可能缩小到您需要的分辨率但不低于它
- 通过使用Canvas::drawBitmap()缩小一点来获得准确的分辨率
Here is detailed explanation how SonyMobile resolved this task: http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/
以下是 SonyMobile 如何解决此任务的详细说明:http: //developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/
Here is the source code of SonyMobile scale utils: http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/
这是 SonyMobile scale utils 的源代码:http: //developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/
回答by CRUSADER
Try below mentioned code for resizing bitmap.
尝试下面提到的用于调整位图大小的代码。
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 ;
}
I used this code to downsize my bitmap, and its quality, well.. , was acceptable.
我用这段代码缩小了我的位图,它的质量,嗯..,是可以接受的。
Hope this helps.
希望这可以帮助。