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

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

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

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

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

Возможный дубликат Обрезать изображение в android

Sniffer 10.09.2018 09:24

@Srijay, дайте нам знать, подходит ли вам ответ (-а)

Thomas Richter 10.09.2018 15:06

@ThomasRichter спасибо за ответ, но это не решило мою проблему, пожалуйста, проверьте комментарий, который я добавил к вашему ответу

Srijay 11.09.2018 07:21
0
3
448
1

Ответы 1

По этой причине я использую 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;
}

Прежде всего, я создаю пустой фон для холста с необходимыми мне измерениями (ширина, рост и конфигурация растрового изображения). Внимание: ширина и высота являются измерениями вырезанного участка ЖЕЛАННЫЙ исходного растрового изображения. Икс и у определяют верхний левый угол, откуда мы хотим получить секцию.

enter image description here

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

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

Я пробовал то, что вы сказали, весь предварительный просмотр сохраняется в хранилище, а не часть в прямоугольнике, переменные x, y, width, height, которые вы упомянули, относятся к bitmap.width () и bitmap.height (), верно?

Srijay 11.09.2018 07:19

@Srijay: Я обновил свой ответ, чтобы уточнить, как следует использовать эту функцию. Ширина и высота НЕ являются шириной и высотой растрового изображения, а являются шириной и высотой раздела, который необходимо вырезать из растрового изображения. x и y указывают координаты исходного растрового изображения, с которого следует начать вырезание секции.

Thomas Richter 12.09.2018 13:55

проблема решена, размытое изображение было из-за размера изображения камеры, я изменил параметры камеры, чтобы установить размер изображения. Теперь изображение четкое. Спасибо!

Srijay 20.09.2018 09:13

Другие вопросы по теме