Android: mPrevCallback to JPG, результаты в черных картинках

Я пытаюсь сделать предварительный просмотр камеры на виде с поверхности, чтобы сохранить ее в формате JPEG во внутренней памяти. Я нашел здесь код на этом сайте, который в основном делает то, что я хочу, но сохраняет изображение на SD-карту. Я изменил это и придумал следующий код.

Camera.PreviewCallback mPrevCallback = new Camera.PreviewCallback()
{
    @Override
    public void onPreviewFrame( byte[] data, Camera Cam ) {
        //Log.d(TAG, "FRAME");
        Camera.Parameters parameters = Cam.getParameters();
        int format = parameters.getPreviewFormat();
        //Log.d(TAG, "FORMAT:" + format);
        //YUV formats require more conversion
        if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) {
            int w = parameters.getPreviewSize().width;
            int h = parameters.getPreviewSize().height;
            // Get the YuV image
            YuvImage yuv_image = new YuvImage(data, format, w, h, null);
            // Convert YuV to Jpeg
            Rect rect = new Rect(0, 0, w, h);
            ByteArrayOutputStream output_stream = new ByteArrayOutputStream();
            yuv_image.compressToJpeg(rect, 100, output_stream);
            byte[] byt = output_stream.toByteArray();
            FileOutputStream outStream = null;
            try {
                outStream = new FileOutputStream("/data/data/com.example.max.camtest/files/test"+System.currentTimeMillis()+".jpg");
                outStream.write(byt);
                outStream.close();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }


        }
    }
};

Предварительный просмотр отображается на виде с поверхности, и запускается mPrevCallback. Он успешно сохраняет изображения, которые имеют различные размеры (250~500 КБ), но все они черные. Когда я пытаюсь сделать снимок с помощью функции camera.takePicture, он тоже черный.

Что я делаю неправильно? Как я могу отладить это? Спасибо!

1 ответ

Используйте это намерение, чтобы сделать снимок

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File f = new File(android.os.Environment.getExternalStorageDirectory(), AppInfo.getInstance().getCurrentLoginUserInfo().getId()+".jpg");
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
            intent.putExtra("return-data", true);
            startActivityForResult(intent, 1);

и на результат вашей деятельности.... Note Bitmap bitmap = getScaledBitmap(uri.getPath(), 200, true); 200 ваш максимальный размер изображения.

if(requestCode == 1)
        {
String base = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
            final String imgPath = base + "/" +AppInfo.getInstance().getCurrentLoginUserInfo().getId()+".jpg";
            File file = new File(imgPath);
            if (file.exists()) 
            {
                Uri uri = Uri.fromFile(file);

            Log.d(TAG, "Image Uri path: " + uri.getPath());

            Bitmap bitmap = getScaledBitmap(uri.getPath(), 200, true);

        }}

Этот метод вернет растровое изображение после изменения его размера.

private Bitmap getScaledBitmap(String imagePath, float maxImageSize, boolean filter) {

FileInputStream in;
BufferedInputStream buf;

try {
    in = new FileInputStream(imagePath);

    buf = new BufferedInputStream(in);
    Bitmap realImage = BitmapFactory.decodeStream(buf);


    float ratio = Math.min(
            (float) maxImageSize / realImage.getWidth(),
            (float) maxImageSize / realImage.getHeight());

    int width = Math.round((float) ratio * realImage.getWidth());
    int height = Math.round((float) ratio * realImage.getHeight());

    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width, height, filter);
    return newBitmap;

} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

return null;
}

Теперь вы масштабировали растровое изображение.

Надеюсь, это поможет вам.

Другие вопросы по тегам