我想将我的位图图像大小减小到最大 640 像素。例如,我有大小为 1200 x 1200 像素的位图图像。如何将其减小到 640 像素。
问问题
42703 次
4 回答
101
如果您传递位图width
然后height
使用:
public Bitmap getResizedBitmap(Bitmap image, int bitmapWidth, int bitmapHeight) {
return Bitmap.createScaledBitmap(image, bitmapWidth, bitmapHeight, true);
}
如果要保持位图比例相同,但将其减小到最大边长,请使用:
public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
int width = image.getWidth();
int height = image.getHeight();
float bitmapRatio = (float) width / (float) height;
if (bitmapRatio > 1) {
width = maxSize;
height = (int) (width / bitmapRatio);
} else {
height = maxSize;
width = (int) (height * bitmapRatio);
}
return Bitmap.createScaledBitmap(image, width, height, true);
}
于 2013-04-02T08:31:36.553 回答
15
使用此方法
/** getResizedBitmap method is used to Resized the Image according to custom width and height
* @param image
* @param newHeight (new desired height)
* @param newWidth (new desired Width)
* @return image (new resized image)
* */
public static Bitmap getResizedBitmap(Bitmap image, int newHeight, int newWidth) {
int width = image.getWidth();
int height = image.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 resizedBitmap = Bitmap.createBitmap(image, 0, 0, width, height,
matrix, false);
return resizedBitmap;
}
于 2013-04-02T08:17:13.360 回答
13
或者你可以这样做:
Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);
通过 filter = false 将产生块状的像素化图像。
通过 filter = true 会给你更平滑的边缘。
于 2013-04-02T08:18:34.683 回答
0
这是将位图图像分辨率(像素)降低到所需值的工作代码...
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.Toast;
public class ImageProcessActivity extends AppCompatActivity {
private static final String TAG = "ImageProcessActivity";
private static final String IMAGE_PATH = "/sdcard/DCIM/my_image.jpg";
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
public static Bitmap decodeSampleDrawableFromFile(String file, int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(file, options);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_process);
new AsyncTask<Object, Object, Bitmap>() {
@Override
protected Bitmap doInBackground(Object... objects) {
try {
return decodeSampleDrawableFromFile(IMAGE_PATH, 640, 640);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
((ImageView) findViewById(R.id.img)).setImageBitmap(bitmap);
}
}.execute();
}
}
脚步:
获取
Bitmap.Options
(图像信息)。将大小采样到所需的样本大小。
Bitmap
使用给定选项(所需分辨率)从图像文件加载到对象bitmap
中。但是在后台线程中执行此操作。
Bitmap
将图像加载到ImageView
UI 线程 (onPostExecute()
) 中。
于 2018-04-20T08:56:52.373 回答