Как распечатать андроид вид на картинку с трансформацией? - PullRequest
0 голосов
/ 04 июня 2019

Я хочу сделать постобработку в своем фото-приложении и хочу иметь возможность печатать / отображать представление Android в растровом изображении. Проблема в том, что изображение можно масштабировать, поворачивать и перемещать. Так вот результаты:

1) изображение (сетка с монетой) и вид Android (прямоугольник «ТЕСТ» поверх него, вложенный в FrameLayout) Android view 1 2) Я взял растровое изображение и распечатал его на растровое изображение. Как видите, позиция зеленого прямоугольника уже не такая, как в 1) Bitmap 1 3) это тоже картинка и вид сверху Android view 2 4) и как вы можете видеть положение прямоугольника так же, как на 3) (потому что не было масштабирования и вращения, только перемещение) Bitmap 2

Вот код:

val childView = editTextsContainer.getChildAt(i)
val viewBitmap = Bitmap.createBitmap(childView.measuredWidth, childView.measuredHeight, Bitmap.Config.ARGB_8888)
val canvas = Canvas(viewBitmap)
childView.draw(canvas)
val relativeX = childView.x / editTextsContainer.width
val relativeY = childView.y / editTextsContainer.height
val relativePivotX = childView.pivotX / editTextsContainer.width
val relativePivotY = childView.pivotY / editTextsContainer.height

Здесь я беру значения из поля зрения и печати растровых изображений вместе:

val canvas = Canvas(originalImage)
val originWidth = originalImage.width
val originHeight = originalImage.height

val deltaScaleX = originWidth.toFloat() / postProcessData.containerWidth
val deltaScaleY = originHeight.toFloat() / postProcessData.containerHeight

for (bitmapInfo in postProcessData.bitmapsInfoList) {
    val scaleX = deltaScaleX * bitmapInfo.scaleX
    val scaleY = deltaScaleY * bitmapInfo.scaleY
    val pivotX = bitmapInfo.relativePivotX * originWidth
    val pivotY = bitmapInfo.relativePivotY * originWidth
    val x = bitmapInfo.relativeX * originWidth //+ bitmapInfo.bitmap.width * scaleX * cos(bitmapInfo.rotation)
    val y = bitmapInfo.relativeY * originHeight //+ bitmapInfo.bitmap.height * scaleY * cos(bitmapInfo.rotation)
    val matrix = Matrix().apply {
          this.postRotate(bitmapInfo.rotation, pivotX, pivotY)
          this.postScale(scaleX, scaleY)
          this.postTranslate(x, y)
   }
 canvas.drawBitmap(bitmapInfo.bitmap, matrix, null)

Я использую «относительные» значения, которые вызывают представление Android, и его растровое изображение находится в разных системах координат, например, структура кадра, в которую вложен зеленый прямоугольник, имеет размеры 1080/1040, а фотография, где я печатаю растровое изображение, имеет Width = 1944 и высота = 2592.

Так что я делаю не так? Мне кажется, я что-то пропустил ...

Спасибо всем заранее!

...