Taking screen shot of a SurfaceView in android

后端 未结 4 962
没有蜡笔的小新
没有蜡笔的小新 2020-12-09 19:30

I am using following method to taking screen shot of a particular view which is a SurfaceView.

public void takeScreenShot(View surface_view){

    // create          


        
相关标签:
4条回答
  • 2020-12-09 20:11

    Try using this one

    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);
    
    0 讨论(0)
  • 2020-12-09 20:17

    use this method its works fine for me actually surfaceview does not work with v1.setDrawingCacheEnabled(true); i do this by using this code.

     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;
    
                }
    
            }
    
        };
    
    0 讨论(0)
  • 2020-12-09 20:21

    Once you get the bitmap, you can copy only a part of it like this:

     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;
        }
    
    0 讨论(0)
  • 2020-12-09 20:24

    Surface view is a view but item on surface view like bitmap or other object are not any view. So while you capture surface view it will capture every thing on the surface. You have to use other view like image view or other above the surface view and then capture those view.

    First get the view whose picture want to take then do this

                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();
                } 
    
    0 讨论(0)
提交回复
热议问题