1

内部メモリに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 {
            }


        }
    }
};

プレビューが surfaceview に表示され、mPrevCallback がトリガーされます。さまざまなサイズ (250 ~ 500Kb) の画像が正常に保存されますが、それらはすべて黒です。camera.takePicture 関数で写真をキャプチャしようとすると、それも黒くなります。

私は何を間違っていますか?どうすればこれをデバッグできますか? ありがとう!

4

1 に答える 1

0

このインテントを使用して写真を撮ります

            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;
}

これで、ビットマップ イメージがスケーリングされました。

これがお役に立てば幸いです。

于 2015-05-14T17:02:10.447 に答える