Вращение растрового изображения с использованием матрицы - PullRequest
2 голосов
/ 09 августа 2010

При вращении растрового изображения с использованием матрицы вершина нестабильна.

  Matrix matrix = new Matrix();
    matrix.postRotate(mDegree,100,100);
    mCompasstemp = Bitmap.createBitmap(mCompPic, 0, 0, mCompPic.getWidth(), mCompPic.getHeight(), matrix, true);
    mCompassHud.setImageBitmap(mCompasstemp);

Вывод моего кода похож на -bitmap будет вращаться. вершина моего растрового изображения не является стабильной. -Bitmap изменяет размер

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

Ответы [ 4 ]

5 голосов
/ 25 ноября 2010

Вместо создания нового растрового изображения непосредственно из оригинала, другой (более прямой, imho) вариант - создать результирующее растровое изображение, создать холст с этим растровым изображением, затем выполнить вращение / перевод / масштабирование на холсте инарисуйте исходный растр на новом растре с помощью Canvas.

По сути, вы смотрите:

  scaledImage = Bitmap.createBitmap (croppedWidth, croppedHeight, Bitmap.Config.ARGB_8888);

  Canvas offscreenCanvas = new Canvas (scaledImage);
  Matrix matrix = new Matrix();
  matrix.setRotate (rotations, centreX, centreY);
  matrix.postScale(scaleX, scaleY);
  offscreenCanvas.setMatrix (matrix);

  offscreenCanvas.drawBitmap (pickedImage, 0, 0, new Paint(Paint.DITHER_FLAG));
1 голос
/ 25 мая 2011

Я пробовал этот код, и вращение стабильно в центре растрового изображения

matrix.reset();
matrix.setRotate(degree, Xpos+bitmap.getWidth()/2, Ypos+bitmap.getHeight()/2);

, а затем на холсте doDraw ()

canvas.setMatrix(matrix);               
canvas.drawBitmap(bitmap, Xpos, Ypos, null);
canvas.setMatrix(null);

Xpos и Ypos - это положение X и Y растрового изображения. SetMatrix (null), установить матрицу в null, чтобы поворот не влиял на растровое изображение И это не всегда создавало новые растровые изображения, так что это здорово для производительности Я надеюсь, что помощь

1 голос
/ 21 октября 2010

Не уверен, что это то, что вы ищете, но это может помочь.

Android использует встроенные функции совместимости для масштабирования и рендеринга растрового изображения соответствующим образом для экранов с различной плотностью пикселей. Существует два метода масштабирования: предварительное масштабирование и автоматическое масштабирование.

Он будет предварительно масштабировать растровые изображения из ресурсов и автоматически масштабировать, когда растровое изображение рисуется внутри (что вы и делаете, используя createBitmap).

Перейти к http://developer.android.com/guide/practices/screens_support.html и проверить под: 4.Используйте ресурсы плотности и / или размера: Предварительное масштабирование и автоматическое масштабирование растровых изображений и девяти исправлений

0 голосов
/ 19 марта 2015

Я знаю, что это старый вопрос, но все ответы с кодом подразумевают холст, поэтому вот решение без холста, которое сработало для меня:

Matrix matrix = new Matrix();
matrix.postRotate(mDegree,100,100);
mCompasstemp = Bitmap.createBitmap(mCompPic, 0, 0, mCompPic.getWidth(),
    mCompPic.getHeight(), matrix, true);

mCompasstemp = Bitmap.createScaledBitmap(mCompassTemp, mCompPic.getWidth(),
    mCompic.getHeight(), false);

mCompassHud.setImageBitmap(mCompasstemp);

Таким образом, после поворота растрового изображения вы масштабируете его до нужного размера. Возможно, это не лучшая практика, но, по крайней мере, вам не нужно создавать дополнительный холст, если вы этого не хотите / не хотите, поскольку использование объекта Paint () также не является недорогой операцией.

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