Обрезать и сохранить размер изображения Android - PullRequest
1 голос
/ 28 января 2011

Это действительно сложный вопрос, чтобы объяснить словами (ну, в любом случае, для меня). Мне нужно иметь возможность взять изображение (растровое изображение) и обрезать изображение до определенного размера в центре экрана, но сохранить размер изображения таким же. Надеюсь, что картина ниже может объяснить, что я имею в виду:

enter image description here

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

Ответы [ 3 ]

3 голосов
/ 28 января 2011

Итак, допустим, вы выполнили обнаружение лица и обнаружили одно лицо на вашем изображении.Ваше изображение имеет размер 320 x 240, а лицо связано прямоугольником с местоположением 100,40 и шириной 20 x 30. Что бы вы хотели сделать с этой информацией?Я сделаю все возможное, чтобы помочь, но вам, вероятно, придется выяснить любые плохие предположения с моей стороны.

Во-первых, вы можете взять лицо и сохранить его в новом растровом изображении с чем-то вроде Bitmap.createBitmap () :

Bitmap face = Bitmap.createBitmap(largeSource, 100, 40, 20, 30);

Это должно быть сделано вне цикла отрисовки, как в onCreate или каком-либо другом шаге инициализации.

Похоже, выполучил некоторый контейнер (ImageView? Custom View с переопределенным onDraw?), который содержит ваше большое изображение.А теперь вы хотите просто нарисовать лицо в этом контейнере в его исходном положении?Если у вас есть пользовательское представление, это просто, как показано в вашем onDraw:

canvas.drawBitmap(face, 100, 40, facePaint);

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

Наконец, если у вас есть куча этих граней, создайте новый объект FaceObj POJO, который имеет только растровые изображения, координаты x и y,Когда вы обнаружите лица, добавьте их в ArrayList, а затем итерируйте по этому в вашем onDraw, чтобы нарисовать все ваши лица:

faces.add(new FaceObj(Bitmap.createBitmap(largeSource, 100, 40, 20, 30), 100, 40);

...

foreach(FaceObj f : faces)
    canvas.drawBitmap(f.bitmap, f.x, f.y, facePaint);
0 голосов
/ 28 января 2011

Если все , которые вас интересуют, это центр изображения, то один из действительно простых способов сделать это - просто добавить атрибут android: scaleType = "center" в свой ImageView и установитьImageView к размеру урожая вы хотите.Если вы хотите, чтобы он был позиционируемым, то это уже другая история.

Используя Canvas.drawBitmap(), вы можете скопировать часть изображения в другое растровое изображение.и отказаться от другого.С этой конкретной версией метода вы можете отправить массив цветов, которые вы получите с помощью getPixels(), и установить смещение, а также ширину и высоту, которые вы хотите скопировать.Параметр stride важен, так как его необходимо установить в ширину исходного изображения, даже если ваше конечное изображение будет меньше, так как оно вытягивает пиксели из исходного изображения.

0 голосов
/ 28 января 2011

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

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

Таким образом, координаты вашего "обрезанного" изображения на экране останутся такими же.

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