Снимок экрана программно в Android - PullRequest
1 голос
/ 24 апреля 2019

Я делаю снимок экрана программно, используя следующий код:

public static Bitmap takeScreenshot(View view)
    {
        try
        {
            // create bitmap screen capture
            view.setDrawingCacheEnabled(true);
            Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
            view.setDrawingCacheEnabled(false);
            return bitmap;
        }
        catch (Throwable e)
        {
            CustomLogHandler.printError(e);
        }
        return null;
    }

private static void copyFile(Bitmap bitmap)
    {
        File dstFile = getShareResultFile();

        //Delete old file if exist.
        if(dstFile.exists()) {
            dstFile.delete();
        }

        FileOutputStream fos = null;
        try
        {
            fos = new FileOutputStream(dstFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 0, fos);
            fos.flush();
        }
        catch (Exception e) {
            CustomLogHandler.printError(e);
        }
        finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException ioe) {
                    CustomLogHandler.printError(ioe);
                }
            }
        }
    }

Есть несколько проблем, таких как:

  1. Неправильный цвет фона стрелки назад, заголовка и общего меню. Это выглядит грязно.
  2. Цвет фона панели инструментов полностью изменен.
  3. Качество изображения слишком низкое, а элементы списка с закругленными углами не имеют ровных углов.
  4. Не задан фон макета, который я установил в качестве фона моего родительского макета.

Я делаю скриншот из корневого представления.

ma

Ответы [ 4 ]

3 голосов
/ 24 апреля 2019
bitmap.compress(Bitmap.CompressFormat.JPEG, 0, fos);

Сначала вы сохраняете это как JPEG.JPEG предназначен для фотографий, и ваш скриншот не является фотографией.

Во-вторых, вы сохраняете его с коэффициентом качества 0. JPEG использует алгоритм сжатия с потерями, а коэффициент качества 0 говорит: «Пожалуйста, почувствуйтеВы можете сделать это изображение действительно плохим, но сожмите его настолько, насколько сможете ».

Я предлагаю переключиться на:

bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

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

2 голосов
/ 24 апреля 2019

Попробуйте использовать это:

  public static Bitmap loadBitmapFromView(Context context, View v) {
        DisplayMetrics dm = context.getResources().getDisplayMetrics(); 
        v.measure(MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.EXACTLY));
        v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
        Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
                v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(returnedBitmap);
        v.draw(c);

        return returnedBitmap;
    }

и

public void takeScreen() {
    Bitmap bitmap = ImageUtils.loadBitmapFromView(this, view); //get Bitmap from the view
    String mPath = Environment.getExternalStorageDirectory() + File.separator + "screen_" + System.currentTimeMillis() + ".jpeg";
    File imageFile = new File(mPath);
    OutputStream fout = null;
    try {
        fout = new FileOutputStream(imageFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
        fout.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        fout.close();
    }
}

Изображения сохраняются во внешней папке хранения.

2 голосов
/ 24 апреля 2019
public static Bitmap takeScreenshot(View view)
{
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

Этот код может сохранить вид как растровое изображение.Но после того, как вы обновили свой вопрос с помощью кода сохранения, я вижу, что вы установили 0 для качества, и что вы ожидаете?

@param quality  Hint to the compressor, 0-100. 0 meaning compress for
     *                 small size, 100 meaning compress for max quality. Some
     *                 formats, like PNG which is lossless, will ignore the
     *                 quality setting

просто используйте кнопку Ctrl + кликните по названию метода, чтобы прочитать документ о параметрах

в ответе задается второй параметр 100 вместо 0!

1 голос
/ 24 апреля 2019

попробуйте

private void captureScreen() {
     View v =  this.getWindow().getDecorView().findViewById(android.R.id.content);
    v.setDrawingCacheEnabled(true);
    Bitmap bitmap = v.getDrawingCache();
    String extr = Environment.getExternalStorageDirectory().toString();
    File file = new File(extr, getString(R.string.free_tiket) + ".jpg");
    FileOutputStream f = null;
    try {
        f = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, f);
        f.flush();
        f.close();
        MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Screen", "screen");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
...