Медленная четкость при рисовании растрового изображения преобразования на холсте в Android

#android #canvas #android-canvas #transformation

#Android #холст #android-холст #преобразование

Вопрос:

Я пытаюсь дополнительно обработать изображение Camera2. Поскольку камеры в устройствах имеют разные повороты и переворачиваются в зависимости от задней и передней камеры, я использую преобразования для правильного поворота. transformationMatrix это та матрица для фронтальной камеры, которая имеет поворот 270.

Затем из этого преобразованного изображения с камеры я хочу скопировать окно прокрутки в другое растровое изображение. Я хочу сохранить это растровое изображение / состояние и нарисовать линию перед рисованием finalBitmapWithScanner на экране телефона.

Есть ли способ сделать это более эффективно и быстро? second line Для завершения требуется 200 мс, что является основной проблемой здесь.

    Canvas canvas = new Canvas(tempBitmap);
   canvas.drawBitmap(cameraBitmap, transformationMatrix, paint); // <=  200ms 
   Rect src = new Rect((int) lastXPos, 0, (int) mXPos, mViewHeight);
   Canvas canvas2 = new Canvas(finalBitmap);
   canvas2.drawBitmap(tempBitmap, src, src, paint);
   Canvas canvas3 = new Canvas(finalBitmapWithScanner);
   canvas3.drawBitmap(finalBitmap, 0, 0, paint);
   canvas3.drawLine(mXPos, 0, mXPos, mViewHeight/2, scrollerPaint);


    transformationMatrix.reset();
    transformationMatrix.setRotate(270, imageHeight, 0);
    transformationMatrix.postTranslate(-imageHeight, 0);
    transformationMatrix.postScale(scaleFactor, scaleFactor);
    transformationMatrix.postScale(-1f, 1f, mViewWidth / 2f, mViewHeight / 2f);
  

Ответ №1:

Есть несколько способов добиться быстрого рендеринга:

  1. Вы можете передать параметры «paint» равным нулю.
  2. также вы можете использовать функцию createScaledBitmap и заметить, что перед рендерингом необходимо установить масштаб и размер, как показано Ниже:

Как вы можете видеть в документации, введите описание ссылки здесь; вам нужно изменить размер и масштаб вашего растрового изображения перед рендерингом, чтобы вы могли использовать приведенный ниже код для вашего BitmapFactory.Опции :

 mBitmapOptions.inScaled = true;
mBitmapOptions.inDensity = srcWidth;
mBitmapOptions.inTargetDensity =  dstWidth;

// will load amp; resize the image to be 1/inSampleSize dimensions
    mCurrentBitmap = BitmapFactory.decodeResources(getResources(), 
         mImageIDs, mBitmapOptions);
  
  1. используйте canvas.restore() после функции рисования.