Захват только части экрана - PullRequest
       19

Захват только части экрана

0 голосов
/ 10 сентября 2018

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

captuteimageonpro.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               camera.takePicture(null, null, mPictureCallback);
           }
       });


Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
       @Override
       public void onPictureTaken(byte[] data, Camera camera) {

           BitmapFactory.Options options = new BitmapFactory.Options();
           options.inScaled = false;
           Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

           Display display = getWindowManager().getDefaultDisplay();
           Point size = new Point();
           display.getSize(size);
           int width = bitmap.getWidth();
           int height = bitmap.getHeight();

           int start_width = (int) (width * 0.15);
           int start_height = (int) (height * 0.16);
           int end_width = start_width + (int) (width * 0.70);
           int end_height = start_height + (int) (height * 0.52);
           //the decimal values in above lines are the percentages of the rectangle position relative to screen

           int no_pixels = (end_width - start_width) * (end_height - start_height);
           int[] pixels = new int[no_pixels];
           ByteArrayOutputStream bos = new ByteArrayOutputStream();

           bitmap.getPixels(pixels, 0, (end_width - start_width), start_width, start_height, (end_width - start_width), (end_height - start_height));

           bitmap = Bitmap.createBitmap(pixels, 0, (end_width - start_width), (end_width - start_width), (end_height - start_height), Bitmap.Config.ARGB_8888);

           ByteArrayOutputStream stream = new ByteArrayOutputStream();
           bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
           byte[] byteArray = stream.toByteArray();
           bitmap.recycle();

           File picture_file = getOutputMediaFile();
           if(picture_file == null)
           {
               return;
           }
           else {
               try {
                   FileOutputStream fos = new FileOutputStream(picture_file);
                   fos.write(byteArray);

                   fos.close();

                   camera.startPreview();


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



private File getOutputMediaFile()
   {
       String state = Environment.getExternalStorageState();
       if(!state.equals(Environment.MEDIA_MOUNTED))
       {
           return null;
       }
       else
       {
           File folder_gui = new File(Environment.getExternalStorageDirectory()+ File.separator+"GUI");

           if(!folder_gui.exists())
           {
               folder_gui.mkdirs();
           }
           File outputFile = new File(folder_gui,"temp.jpg");
           return outputFile;
       }

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

Я не хочу обрезать изображение вручную, просто после нажатия кнопки часть предварительного просмотра камеры, которая присутствует в прямоугольнике, должна быть сохранена в памяти.

1 Ответ

0 голосов
/ 10 сентября 2018

По этой причине я использую Canvas. По сути, я создаю пустой холст с нужными мне измерениями и рисую выбранную часть растрового изображения на холсте:

private Bitmap cropBitmap(Bitmap bitmap, int x, int y, int width, int height) { 
    Bitmap defaultBitmap = Bitmap.createBitmap(width, height, bitmap.getConfig());
    Canvas canvas = new Canvas(defaultBitmap); 
    canvas.drawBitmap(bitmap, new Rect(x,y,width,height), new Rect(0,0,width,height), new Paint());
    return bitmap;
}

Прежде всего, я создаю пустой фон для холста с нужными мне измерениями ( ширина , высота и конфигурация растрового изображения). Внимание: ширина и высота являются измерениями вырезанного участка DESIRED оригинального растрового изображения. x и y определяют верхний левый угол, откуда мы хотим получить сечение.

enter image description here

Первый Rect выбирает часть растрового изображения, которую мы должны нарисовать на холсте. Второй Rect указывает местоположение и размер обрезанного изображения на холсте (полный размер в этом примере).

Вы также можете посмотреть документацию по холсту здесь: https://developer.android.com/reference/android/graphics/Canvas#Canvas(android.graphics.Bitmap)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...