我使用本教程作为向我的应用添加功能的指南:
http://developer.android.com/training/camera/photobasics.html
本教程附带的示例不完整,包含一些“错误”。我把错误一词放在引号中,因为主要教程的内容已经涵盖:使用相机。
我专注于从拍摄的大照片中获取缩略图。当您运行该示例时,您会立即注意到大部分时间没有显示大照片的缩略图,尽管它已正确存储在表示的目录中。
做了一些工作我发现了以下“错误”:
1.-图像的路径值经常丢失,因为活动因内存不足而被破坏。我修复了在方法onSaveInstanceState()中存储照片的路径。
这样我总能访问我的图片,但仍然没有出现。我继续做一些测试并发现:
2.-大多数时候,当要求使用imageview的度量值(宽度和高度)来重新缩放图像时,值为0.我认为这可能是问题,并且发现它是由于您无法获得度量而引起的视图被绘制了。所以我用一个处理程序修复了它并发送了一个延迟消息(1.5'')来执行。现在,测量总是正确获得,但即使大多数时间都没有显示缩略图
所以我认为Bitmap.decodeFile方法返回一个空值,所有变量都正确设置。但事实并非如此,它正在返回一个位图。所以男人和女孩,我知道我无法找到缩略图没有显示的原因。
非常感谢一点帮助。谢谢!
这是重新缩放图像的方法:
//Scaling the real size photo to the image view size
private void setImagenPequena()
{
Log.w("PAth: ", n_path_foto_actual);
// Get the dimensions of the View
int targetW = n_iv_foto.getMeasuredWidth();
int targetH = n_iv_foto.getMeasuredHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(n_path_foto_actual, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
Log.w("setImagenPequena: ", "photoW: " + Integer.toString(photoW));
Log.w("setImagenPequena: ", "photoH: " + Integer.toString(photoH));
Log.w("setImagenPequena: ", "targetW: " + Integer.toString(targetW));
Log.w("setImagenPequena: ", "targetH: " + Integer.toString(targetW));
if(targetW > 0 && targetH > 0)
{
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
bmOptions.inSampleSize = scaleFactor;
}
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(n_path_foto_actual, bmOptions);
if(bitmap == null)
Log.w("valor bitmap: ", "null");
else
Log.w("valor bitmap: ", "!=null");
n_iv_foto.setImageBitmap(bitmap);
}
答案 0 :(得分:1)
我在本教程中遇到了很多问题,但我终于修复了它。 我做了什么:
int scaleFactor = Math。 min (photoW / targetW,photoH / targetH);
通过
int scaleFactor = Math。 max (photoW / targetW,photoH / targetH);
是关键。在此之前我得到了空白图像而不是图片。
否则请在此处使用我的一些代码:
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
mWidth = size.x;
mHeight = size.y;
...
private void setPic() {
int targetW = mWidth;
int targetH = mHeight;
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.max(photoW/targetW, photoH/targetH);
bmOptions.inPreferredConfig = Bitmap.Config.RGB_565;
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath,
bmOptions);
mImageView.setImageBitmap(bitmap);
}