【问题标题】:When using ACTION_IMAGE_CAPTURE why is the preview image blurry使用 ACTION_IMAGE_CAPTURE 时为什么预览图像模糊
【发布时间】:2016-04-07 11:48:14
【问题描述】:

我已经设法实现了 ACTION_IMAGE_CAPTURE 意图的使用,以便在我的应用中拍照。出于某种原因,当拍摄照片时,预览图像(在发送回我的应用程序之前显示带有勾号/十字图标的图像)是方形的并且分辨率非常低,即使我设法拍摄的图片也是如此保存到存储不是。我已经解决了所有抱怨返回低质量图像的问题,所有答案都提供了有关如何在您的应用程序本身中获得更高质量图像的解决方案,而不是如何告诉相机应用程序使用完整质量预览。任何帮助将不胜感激!

【问题讨论】:

    标签: android android-intent camera


    【解决方案1】:

    不是如何告诉相机应用使用全画质预览

    那是因为您无法告诉相机应用“使用全画质预览”。

    有成千上万种 Android 设备型号。这些设备型号中有数百个内置相机应用程序,还有更多可以从 Play 商店等地方下载。 ACTION_IMAGE_CAPTURE 的行为取决于这些应用的开发者,包括:

    • 他们是否有确认屏幕(“在发送回我的应用程序之前显示带有勾号/十字图标”)

    • 确认屏幕上的图像是什么样的

    除了EXTRA_OUTPUT,在输入方面没有其他documented aspect to the ACTION_IMAGE_CAPTURE protocol,因此相机应用不需要提供其他任何东西。

    无论出于何种原因,您的特定相机应用的实现都不是特别好。

    【讨论】:

    • 这是安卓模拟器上使用网络摄像头的默认相机应用。
    【解决方案2】:

    尝试检查以下代码是否适合我的应用程序。

    TakeImageActivity.java

    import java.io.File;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Locale;
    
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    public class TakeImageActivity extends ActivityBase implements OnClickListener {
    
        File file,mFileTemp;
    
        Button buttonTakeImageCam;
        ImageView imageView;
        Uri mPhotoUri;
        Bitmap thumbnail;
        private Uri fileUri;
        private static final String IMAGE_DIRECTORY_NAME = "PhotoEditor Camera";
        public static final int MEDIA_TYPE_IMAGE = 1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.take_image_activity);
    
            file = new File(Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + "/FrameImages");
    
            initializetion();
    
        }
    
        private void initializetion() {
            // TODO Auto-generated method stub
            buttonTakeImageCam = (Button) findViewById(R.id.buttonTakeImageCam);
            buttonTakeImageCam.setOnClickListener(this);
    
            if (!isDeviceSupportCamera()) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! Your device doesn't support camera",
                        Toast.LENGTH_LONG).show();
                // will close the app if the device does't have camera
                finish();
            }
        }
    
        private boolean isDeviceSupportCamera() {
            if (getApplicationContext().getPackageManager().hasSystemFeature(
                    PackageManager.FEATURE_CAMERA)) {
                // this device has a camera
                return true;
            } else {
                // no camera on this device
                return false;
            }
        }
    
        public Uri getOutputMediaFileUri(int type) {
            return Uri.fromFile(getOutputMediaFile(type));
        }
    
        private static File getOutputMediaFile(int type) {
    
            // External sdcard location
            File mediaStorageDir = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    IMAGE_DIRECTORY_NAME);
    
            // Create the storage directory if it does not exist
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                            + IMAGE_DIRECTORY_NAME + " directory");
                    return null;
                }
            }
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                    Locale.getDefault()).format(new Date());
            File mediaFile;
            if (type == MEDIA_TYPE_IMAGE) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "IMG_" + timeStamp + ".jpg");
            } else {
                return null;
            }
    
            return mediaFile;
        }
    
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
    
            switch (v.getId()) {
    
            case R.id.buttonTakeImageCam:
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    
                fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
    
                intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    
                // start the image capture Intent
                startActivityForResult(intent, 2);
                break;
            default:
                break;
            }
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // TODO Auto-generated method stub
            if (resultCode != RESULT_OK)
                return;
    
            switch (requestCode) {
    
            case 2:
                    if (resultCode == RESULT_OK) {
                        // successfully captured the image
                        // display it in image view
                        previewCapturedImage();
                    } else if (resultCode == RESULT_CANCELED) {
                        // user cancelled Image capture
                        Toast.makeText(getApplicationContext(),
                                "User cancelled image capture", Toast.LENGTH_SHORT)
                                .show();
                    } else {
                        // failed to capture image
                        Toast.makeText(getApplicationContext(),
                                "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                                .show();
                    }
                break;
            }
        }
            private void previewCapturedImage() {
                try {
                    // bimatp factory
                    BitmapFactory.Options options = new BitmapFactory.Options();
    
                    // downsizing image as it throws OutOfMemory Exception for larger
                    // images
                    options.inSampleSize = 2;
    
                    final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                            options);
    
                      //Set image here
                    imgPreview.setImageBitmap(bitmap);
    
                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            }
    
        public Bitmap getPreview(String fileName) {
            File image = new File(fileName);
    
            BitmapFactory.Options bounds = new BitmapFactory.Options();
            bounds.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(image.getPath(), bounds);
            if ((bounds.outWidth == -1) || (bounds.outHeight == -1)) {
                return null;
            }
            int originalSize = (bounds.outHeight > bounds.outWidth) ? bounds.outHeight
                    : bounds.outWidth;
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inSampleSize = originalSize / 64;
            // opts.inSampleSize = originalSize;
            return BitmapFactory.decodeFile(image.getPath());
        }
    
        public String getPath(Uri uri) {
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
    }
    

    take_image_activity.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center" >
    
        <Button 
            android:id="@+id/buttonTakeImageCam"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="10dp"
            android:textSize="25sp"
            android:text="Camera"/>
    
    </RelativeLayout>
    

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.camera.photo"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="9" />
    
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.CAMERA"/>
        <uses-feature android:name="android.hardware.camera" android:required="true"/>
    
        <application
            android:icon="@drawable/ic_launcher"
            android:largeHeap="true"
            android:label="@string/app_name" >
            <activity
                android:name=".TakeImageActivity"
                android:hardwareAccelerated="false"
                android:screenOrientation="portrait"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    【讨论】:

      猜你喜欢
      • 2019-10-23
      • 2023-03-08
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2013-10-19
      • 2014-10-26
      相关资源
      最近更新 更多