Поверните изображение несколько раз, но держите углы вровень

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

Matrix matrix = new Matrix(); matrix.setRotate(10); Bitmap newImage = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true); 

Вы можете увидеть фотографии:

оригинал

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

Повернуть на 10 градусов

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

Снова поверните на 10 градусов

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

Снова поверните на 10 градусов

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

Синие прямоугольники – это полные изображения.

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

Как изменить код, чтобы сохранить углы на границе (как и на втором изображении)?

Я забыл сказать, что создал демонстрационный проект на github. Вы можете клонировать его, основной код Java здесь:

https://github.com/freewind/Android-RotateTest/blob/master/src/com/example/MyActivity.java

Я попробовал ваш код и после некоторого поворота разбился с причиной исключения OutOfMemory каждый раз, когда создается новое растровое изображение, которое очень ресурсоемкое. Вы никогда не должны никогда! Используйте createBitMap () в итерации. Я внесла некоторые изменения в ваш код вращения изображения, и теперь он работает как ожидалось.
Вот код:

 private void addListeners() { this.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Matrix matrix = new Matrix(); //copying the image matrix(source) to this matrix matrix.set(imageView.getImageMatrix()); matrix.postRotate(10, imageView.getWidth()/2, imageView.getHeight()/2); imageView.setImageMatrix(matrix); //checking the size of the image Drawable d = imageView.getDrawable(); Bitmap bmp = ((BitmapDrawable)d).getBitmap(); imageInfo(bmp); } }); } 

Также задает тип шкалы изображения в матрице

 <ImageView android:id="@+id/Image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#336699" android:scaleType="matrix" android:padding="2px" android:src="@drawable/m" /> 

И если мы хотим получить повернутое растровое изображение из ImageView, сделайте следующее:

 private Bitmap getBitmapFromView() { // this is the important code :) // Without it the view will have a dimension of 0,0 and the bitmap will be null imageView.setDrawingCacheEnabled(true); imageView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); imageView.layout(0, 0, imageView.getMeasuredWidth(), imageView.getMeasuredHeight()); imageView.buildDrawingCache(true); Bitmap b = Bitmap.createBitmap(imageView.getDrawingCache()); imageView.setDrawingCacheEnabled(false); // clear drawing cache return b; } 

Надеюсь, это поможет.

Кажется, я не вижу ваших изображений, но у меня была такая же проблема, каждый раз, когда я пытался повернуть изображение, оно, казалось, изменило его размеры.

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

Вот код, который работает для меня, для вращения изображения без изменения его размера:

 public static Matrix rotateMatrix(Bitmap bitmap, Shape shape, int rotation) { float scaleWidth = ((float) shape.getWidth()) / bitmap.getWidth(); float scaleHeight = ((float) shape.getHeight()) / bitmap.getHeight(); Matrix rotateMatrix = new Matrix(); rotateMatrix.postScale(scaleWidth, scaleHeight); rotateMatrix.postRotate(rotation, shape.getWidth()/2, shape.getHeight()/2); rotateMatrix.postTranslate(shape.getX(), shape.getY()); return rotateMatrix; } 

Примечание. Объект shape просто содержит реальные размеры объекта, который вы пытаетесь вращать, например, 100×100.

Надеюсь, это поможет.

Вы должны повернуть первое изображение. Сохраните первое изображение в переменной, а затем создайте копию. Когда вы вращаетесь, всегда делайте новую копию из оригинала и вращайте ее.

РЕДАКТИРОВАТЬ

Измените свой код на это:

  @Override public void onClick(View view) { Matrix matrix = new Matrix(); matrix.setRotate(10); Bitmap copy = image; Bitmap newImage = Bitmap.createBitmap(copy, 0, 0, image.getWidth(), image.getHeight(), matrix, true); setNewImage(newImage); }