11

次の方法を使用して、SurfaceView である特定のビューのスクリーンショットを撮ります。

public void takeScreenShot(View surface_view){

    // create bitmap screen capture
    Bitmap bitmap;
    View v1 = surface_view;
    v1.setDrawingCacheEnabled(true);
    bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.PNG, 0, bos);
    byte[] imageData = bos.toByteArray();

}

問題は、アクティビティ画面全体の画像が表示されることです。しかし、特定のビューのスクリーンショットを撮る必要があります。他の方法を試してみましたが、スクリーンショットとして黒い画面が表示されます。一部の投稿では、ルート化されたデバイスが必要であると書かれています。誰でも私を助けてください。私はこの解決策を必要としています。助けて....

4

4 に答える 4

2

サーフェス ビューはビューですが、ビットマップやその他のオブジェクトなどのサーフェス ビュー上のアイテムはビューではありません。したがって、表面ビューをキャプチャすると、表面上のすべてのものをキャプチャします。画像ビューや表面ビューの上にある他のビューを使用して、それらのビューをキャプチャする必要があります。

最初に写真を撮りたいビューを取得してから、これを行います

            Bitmap bitmap;
            View rv = **your view**
            rv.setDrawingCacheEnabled(true);
            bitmap = Bitmap.createBitmap(rv.getDrawingCache());
            rv.setDrawingCacheEnabled(false);

            // Write File to internal Storage

            String FILENAME = "captured.png";
            FileOutputStream fos = null;

            try {

                fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);

            } catch (FileNotFoundException e1) {

                e1.printStackTrace();
                Log.v("","FileNotFoundException: "+e1.getMessage());

            }

            try {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                fos.flush();
                fos.close();

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
于 2012-10-04T09:56:54.713 に答える
0

ビットマップを取得したら、次のようにその一部のみをコピーできます。

 private Bitmap copyBitmap(Bitmap src){

     //Copy the whole bitmap
     //Bitmap newBitmap = Bitmap.createBitmap(src);

     //Copy the center part only
     int w = src.getWidth();
     int h = src.getHeight();
     Bitmap newBitmap = Bitmap.createBitmap(src, w/4, h/4, w/2, h/2);

     return newBitmap;
    }
于 2012-10-04T09:39:42.717 に答える
0

こいつを使ってみる

Bitmap b = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888);  
v.setDrawingCacheEnabled(false);            
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
于 2012-10-04T09:36:08.750 に答える
0

このメソッドを使用すると、私にとっては問題なく動作します。実際、surfaceview は v1.setDrawingCacheEnabled(true) では動作しません 私はこのコードを使用してこれを行います。

 jpegCallback = new PictureCallback() {

        public void onPictureTaken(byte[] data, Camera camera) {

            camera.startPreview();
            Bitmap cameraBitmap = BitmapFactory.decodeByteArray
                    (data, 0, data.length);
            Matrix matrix = new Matrix();
            matrix.postRotate(90);
            pd = new ProgressDialog(MainActivity.this);
            pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            pd.setTitle("Wait!");
            pd.setMessage("capturing image.........");
            pd.setIndeterminate(false);
            pd.show();

            progressStatus = 0;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (progressStatus < 100) {
                        // Update the progress status
                        progressStatus += 1;

                        try {
                            Thread.sleep(20);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                // Update the progress status
                                pd.setProgress(progressStatus);
                                // If task execution completed
                                if (progressStatus == 100) {
                                    // Dismiss/hide the progress dialog
                                    pd.dismiss();
                                }
                            }
                        });
                    }
                }
            }).start();

            Bitmap rotatedBitmap = Bitmap.createBitmap(cameraBitmap, 0, 0, cameraBitmap.getWidth(), cameraBitmap.getHeight(), matrix, true);
            if (rotatedBitmap != null) {
                rotatedBitmap = combinebitmap(rotatedBitmap, bitmapMap);
                Random num = new Random();
                int nu = num.nextInt(1000);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                byte[] bitmapdata = bos.toByteArray();
                ByteArrayInputStream fis = new ByteArrayInputStream(bitmapdata);
                String picId = String.valueOf(nu);
                String myfile = "Ghost" + picId + ".jpeg";
                File dir_image = new File(Environment.getExternalStorageDirectory() +//<---
                        File.separator + "LiveCamera");          //<---
                dir_image.mkdirs();                                                  //<---

                try {
                    File tmpFile = new File(dir_image, myfile);
                    FileOutputStream fos = new FileOutputStream(tmpFile);

                    byte[] buf = new byte[1024];
                    int len;
                    while ((len = fis.read(buf)) > 0) {
                        fos.write(buf, 0, len);
                    }
                    fis.close();
                    fos.close();
                    Toast.makeText(getApplicationContext(),
                            " Image saved at :LiveCamera", Toast.LENGTH_LONG).show();
                    camera.startPreview();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                MediaScannerConnection.scanFile(MainActivity.this,
                        new String[]{dir_image.toString()}, null,
                        new MediaScannerConnection.OnScanCompletedListener() {
                            public void onScanCompleted(String path, Uri uri) {
                            }
                        });


                safeToTakePicture = true;

            }

        }

    };
于 2017-12-05T07:31:17.410 に答える