我研究了许多不同的方法来创建图像的缩小版本,但它们都不能正常工作/我需要一些不同的东西。
这有点难以解释:-)
我需要的是一个保持图片比例,但大小小于某个特定大小的位图-例如1MB或等效的像素尺寸(因为此位图需要添加为putExtra()用于意图)。
到目前为止我遇到的问题是:
我看过的大多数方法创建了一个缩放版本的位图。所以: Image-> Bitmap1(未缩放)-> Bitmap2(已缩放)。但是,如果图像的分辨率非常高,则缩小的不够多。我认为解决方案是创建一个确切大小的位图,使任何分辨率都可以缩小到足够小的尺寸。
然而,这种方法的副作用将是已经小于所需大小的图像将被调整大小(或调整大小无效?)。因此,需要一个“if”来检查是否可以将图像转换为位图而不进行调整大小。
我不知道如何去做这件事,因此非常感谢任何帮助! :-)
这是我现在正在使用的(它不会做我想要它做的事情):
这是当前调整大小的部分:
如果有任何需要解释的地方,请告诉我。
谢谢。
这有点难以解释:-)
我需要的是一个保持图片比例,但大小小于某个特定大小的位图-例如1MB或等效的像素尺寸(因为此位图需要添加为putExtra()用于意图)。
到目前为止我遇到的问题是:
我看过的大多数方法创建了一个缩放版本的位图。所以: Image-> Bitmap1(未缩放)-> Bitmap2(已缩放)。但是,如果图像的分辨率非常高,则缩小的不够多。我认为解决方案是创建一个确切大小的位图,使任何分辨率都可以缩小到足够小的尺寸。
然而,这种方法的副作用将是已经小于所需大小的图像将被调整大小(或调整大小无效?)。因此,需要一个“if”来检查是否可以将图像转换为位图而不进行调整大小。
我不知道如何去做这件事,因此非常感谢任何帮助! :-)
这是我现在正在使用的(它不会做我想要它做的事情):
// This is called when an image is picked from the gallery
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch (requestCode) {
case 0:
if (resultCode == Activity.RESULT_OK) {
selectedImage = imageReturnedIntent.getData();
viewImage = imageReturnedIntent.getData();
try {
decodeUri(selectedImage);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
iv_preview.setImageBitmap(mImageBitmap);
}
break; // The rest is unnecessary
这是当前调整大小的部分:
private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true; //
BitmapFactory.decodeStream(getActivity().getContentResolver()
.openInputStream(selectedImage), null, o);
// The new size we want to scale to
final int REQUIRED_SIZE = 260; // Is this kilobites? 306
// Find the correct scale value. It should be the power of 2.
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) {
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
o2.inScaled = false; // Better quality?
mImageBitmap = BitmapFactory.decodeStream(getActivity()
.getContentResolver().openInputStream(selectedImage), null, o2);
return BitmapFactory.decodeStream(getActivity().getContentResolver()
.openInputStream(selectedImage), null, o2);
}
如果有任何需要解释的地方,请告诉我。
谢谢。