2010-08-09 2 views
2

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

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 будет вращаться. -vertex моего растрового изображения нестабилен. -Bitmap изменяет размер

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

ответ

1

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

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

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

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

5

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

В принципе, вы смотрите, то, по адресу:

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)); 
+0

спасибо .. безупречный .. –

1

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

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 является Х и Y позиции битовой карты setMatrix (нуль), установите матрицу Null, так что поворот не влияет на после точечного рисунка И это не всегда создает новое растровое изображение, поэтому он отлично подходит для выполнения Я надеюсь, что помощь

+0

вы можете разместить свой полный код – baloo

0

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

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); 

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

Смежные вопросы