Обрезать и сохранить размер изображения Android

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

введите здесь описание изображения

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


person SamRowley    schedule 28.01.2011    source источник
comment
Я думаю, что то, что вы пытаетесь описать, называется областью интереса (ROI). Это может помочь вам Google для некоторых ответов.   -  person mpenkov    schedule 28.01.2011


Ответы (3)


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

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

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

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

Похоже, у вас есть какой-то контейнер (ImageView? Пользовательский вид с переопределенным 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);
person Josh    schedule 28.01.2011

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

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

Таким образом, координаты вашей «обрезанной» картинки на экране останутся прежними.

person Dalmas    schedule 28.01.2011
comment
Также может быть проще создать новое черное изображение того же размера, что и оригинал, и скопировать интересующую область на новое изображение с теми же координатами x/y/шириной/высотой, что и у оригинала. - person Jess; 28.01.2011
comment
Проблема в том, что мне нужно не просто скрыть пиксели, а избавиться от них. Мне нужно сохранить изображение в растровом формате, но попытаться уменьшить размер изображения как можно меньше, чтобы я мог обнаруживать лица. Изменяя пиксели на черные, он по-прежнему сохраняет этот пиксель, поэтому размер файла не теряется. - person SamRowley; 28.01.2011
comment
Итак, возможно, это то, что вы хотите сделать: сначала сохраните верхние левые координаты квадрата, а затем обрежьте его. Затем очистите область рисования и используйте canvas.drawBitmap(bitmap, left, top, paint), где left и top — сохраненные вами координаты. - person Dalmas; 28.01.2011

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

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

person Kevin Coppock    schedule 28.01.2011