我有几天试图在Android中捕获一张照片,想法是在捕获图像后将文件上传到FTP。我有一个扩展SurfaceView的类,当它变得可见时,播放设备后置摄像头的图像,就在这里。点击相机的图像,我想保持图像的JPEG格式。
我已经尝试过几十种解决方案但是,我现在得到的是一个完全黑色的JPEG。我认为我是以正确的方式,但缺少一些东西。
以下是我在自定义类的onClick事件中使用的代码:
try {
//create bitmap screen capture
Bitmap bitmap;
this.setDrawingCacheEnabled(true);
//Freezes the image
mCamera.stopPreview();
bitmap = Bitmap.createBitmap(getDrawingCache(), 0, 0, this.getLayoutParams().width, this.getLayoutParams().height);
this.setDrawingCacheEnabled(false);
//Create temp file
file = File.createTempFile("prueba", ".JPG", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
//Copy bitmap content into file
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 60, fos);
fos.flush();
fos.close();
//Free camera
mCamera.release();
mCamera = null;
}catch(Exception e){
e.printStackTrace();
}
mCamera是android.hardware.Camera,选择了特定的大小并将宽度和高度复制到this.layoutParams,以便完全适合所有这些在surfaceCreated()方法中。
希望有人可以帮助我任何迹象。
非常感谢。
答案 0 :(得分:1)
谢谢你的帮助。
我终于采取了你的解决方案。我喜欢第一个选项,因为相机已集成到应用程序中,因此更容易控制图像的旋转和预览的分辨率。
到目前为止,意图中的图像被调整大小并加载到对象ImagePreview(即ImageView)中。这是我的解决方案:
致电相机意图:
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size()>0) {
pathImagen = android.net.Uri.fromFile(File.createTempFile("prueba"+System.currentTimeMillis(), ".JPG", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)));
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, pathImagen);
startActivityForResult(intent, 94010);
}
获取图片文件并调整大小:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 94010:
if (resultCode == Activity.RESULT_OK) {
Bitmap bmp = null;
try {
//Obtenemos las dimensiones de la imagen (no se carga la imagen completa)
ContentResolver cr = getContentResolver();
cr.notifyChange(pathImagen, null);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(pathImagen.getEncodedPath(), options);
//bmp = android.provider.MediaStore.Images.Media.getBitmap(cr, pathImagen);
System.out.println("Tamaño imagen: "+options.outWidth+"x"+options.outHeight);
//Bitmap bmp = (Bitmap) data.getExtras().get("data");
int anchoFinal = 480;
int altoFinal = (options.outHeight*480)/options.outWidth;
options.inJustDecodeBounds = false;
bmp = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(pathImagen.getEncodedPath(), options), anchoFinal, altoFinal, false);
System.out.println("Tamaño imagen despues escalar: "+bmp.getWidth()+"x"+bmp.getHeight());
this.imagePreView.setVisibility(View.VISIBLE);
this.imagePreView.getLayoutParams().width = bmp.getWidth();
this.imagePreView.getLayoutParams().height = bmp.getHeight();
this.imagePreView.setImageBitmap(bmp);
this.popupEditObject.setVisibility(View.VISIBLE);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
唯一的问题是图像的分辨率始终为3264x1968。无论是谁横向或纵向o_O我都会看到Intent是否返回了一些有关该信息的信息。
我希望这可以帮助更多人,而且我看过很多论坛都没有真正有用的答案。
我希望得到任何反馈来改进代码。
再次感谢!
答案 1 :(得分:0)
我不知道你的位图是否有有效数据,但我可以告诉你,你要问的常用方法是使用startActivityForResult启动相机并取回图像:
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
或附加相机预览的回调,您可以在那里处理图像框http://developer.android.com/reference/android/hardware/Camera.html#setPreviewCallback(android.hardware.Camera.PreviewCallback)
如果您只想让用户拍照,那么我认为如上所述启动意图是您的解决方案。这是我在其中一个应用程序中编写的工作代码片段:
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
// we want the camera image to be put in a specific place
File path;
try {
path = new File(getCameraStoragePath());
} catch (Exception e1) {
e1.printStackTrace();
return;
}
SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyyMMddHHmmssSS");
mFilename = mPeer + "." + timeStampFormat.format(new java.util.Date()) + ".jpg";
try
{
mPath = path.getCanonicalPath();
} catch (IOException e)
{
e.printStackTrace();
}
File out = new File(path, mFilename);
android.net.Uri uri = android.net.Uri.fromFile(out);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
activity.startActivityForResult(intent, CAMERA);
然后实现你自己的onActivityResult来处理用户拍摄后的图像:
protected void onActivityResult(int requestCode, int resultCode, Intent data);