Камера Android - Как я могу взять определенный "прямоугольник" из массива байтов? - PullRequest
10 голосов
/ 11 марта 2012

Я создал приложение, которое снимает и сохраняет фотографии.У меня есть предварительный просмотр и наложение поверх этого предварительного просмотра.Наложение определяет квадрат (область вокруг квадрата показывает предварительный просмотр немного темнее), как вы можете видеть на изображении:

пример

Что мне нужносделать, это извлечь часть изображения, где квадрат.Квадрат определяется следующим образом:

    Rect frame = new Rect(350,50,450,150);

Как я могу это сделать?У меня есть байтовый массив (byte [] data), который я могу сохранить, но я хочу изменить приложение, чтобы сохранить только квадратную область.

Редактировать: я пробовал следующее:

int[] pixels = new int[100000];
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length);
            bitmap.getPixels(pixels, 0, 480, 350, 50, 100, 100);
            bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_4444);
            bitmap.compress(CompressFormat.JPEG, 0, bos);
            byte[] square = bos.toByteArray();

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

Ответы [ 2 ]

10 голосов
/ 12 марта 2012

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

int[] pixels = new int[100*100];//the size of the array is the dimensions of the sub-photo
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length);
        bitmap.getPixels(pixels, 0, 100, 350, 50, 100, 100);//the stride value is (in my case) the width value
        bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_8888);//ARGB_8888 is a good quality configuration
        bitmap.compress(CompressFormat.JPEG, 100, bos);//100 is the best quality possibe
        byte[] square = bos.toByteArray();
4 голосов
/ 12 марта 2012

Данные предварительного просмотра камеры поступают в формате YUV (в частности, ImageFormat.NV21), который BitmapFactory не поддерживает напрямую.Вы можете использовать YuvImage для преобразования его в растровое изображение, как описано здесь .Единственное отличие состоит в том, что вы хотите передать Rect, соответствующий квадрату, который вы хотите при вызове YuvImage.compressToJpeg.

...