У меня есть растровое изображение, и поверх него нарисована фигура. Теперь я вращаю и растровое изображение и хочу, чтобы фигура также вращалась. Как получить точку фигуры?

#android #image #bitmap #rotation

Вопрос:

Я хочу сделать пользовательскую обрезку изображений для Android, которая поддерживает вращение. Кроппер отлично работает. Проблема, с которой я сталкиваюсь при вращении изображения (растрового изображения с использованием матрицы вращения), область наложения обрезки также должна быть повернута соответствующим образом. Для этого я повернул точки формы обрезки, применив другую матрицу поворота. Он отображает точки формы обрезки (в частности, ограничивающую рамку, на которую указывает другой цветной круг на изображении). Матрица вращения применяется для формы урожая вращение применяется с центром формы урожая в качестве источника. Но после поворота формы обрезки точки формы должны быть переведены, чтобы сохранить то же положение и соотношение сторон. Может ли кто-нибудь помочь мне, пожалуйста, достичь этого? Исходное изображение с формой обрезки поверх него [Повернутое изображение, которое я получаю...Посмотрите, форма обрезки не находится в ожидаемом положении, хотя она повернута относительно центральной точки2Фактическое положение посевной площади, которую я ожидаю. Обратите внимание, что при изменении ширины и высоты растрового изображения ширина и высота формы обрезки также должны измениться. Я думаю, что для этого просто нужно перевести положение точек. Поэтому мне нужен способ вычислить обновленное положение точки Я делюсь некоторым фрагментом кода для поворота растрового изображения и обрезки точек формы

 private Bitmap rotateBitmap(Bitmap source, float angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    Bitmap rotatedBitmap = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
    rotateShapePoints(angle);
    return rotatedBitmap;
}
 

Rotate Shape Points

  private void rotateShapePoints(float angle)
{
    PointF centerPoint = getCropShapeView().getCenterPoint(); // return the center of the shape
    Matrix matrix = new Matrix();
    matrix.postRotate(angle,centerPoint.x,centerPoint.y);
    HashMap<Integer,PointF> points = (HashMap<Integer, PointF>) getCropShapeView().getPoints(); // map is used to track the point at different position
    for(Map.Entry<Integer,PointF> entry : points.entrySet())
    {
        int key = entry.getKey();
        PointF value = entry.getValue();
        float[] pointArray = new float[] { value.x,value.y};
        matrix.mapPoints(pointArray);
        PointF rotatedPoint = new PointF(Math.abs(pointArray[0]),Math.abs(pointArray[1]));
        points.put(key,rotatedPoint);
    }
    getCropShapeView().setPoints(points);
    getCropShapeView().invalidate();
}