2014-12-19 9 views
1

В настоящее время я работаю над инструментом обрезки многоточечной связи, и я застрял в течение нескольких дней. Таким образом, в основном, это работает так:Просмотр увеличенного изображения с масштабированным растровым изображением

1) принять большое разрешение фото с камерой устройства
2) поместить полученную битовую карту на экране, используя пользовательский класс (который проходит ImageView)
3) рисовать обработчик над обнаруженные контуры - они позже используются для обрезки большого растрового изображения.

Screen shot

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

@Override 
public void setImageBitmap(Bitmap bm) { 
    originalBitmap = bm.copy(Bitmap.Config.ARGB_8888, true); 
    shaderPaint = new Paint(); 

    shader = new BitmapShader(originalBitmap, TileMode.CLAMP, TileMode.CLAMP); 
    shaderPaint.setShader(shader); 

    shaderMatrix = new Matrix(); 
    .... 


@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    ....... 
    if (zooming) { 
     shaderMatrix.reset(); 
     inverseMatrix.reset(); 
     if (getImageMatrix().invert(inverseMatrix)) { 
      float[] pts = new float[2]; 

      pts[0] = currentMovedPoint.x; 
      pts[1] = currentMovedPoint.y; 
      inverseMatrix.mapPoints(pts); 
      shaderMatrix.postTranslate(-pts[0], -pts[1]);   
      shaderMatrix.postScale(2f, 2f); 

      shader.setLocalMatrix(shaderMatrix); 
      canvas.drawCircle(zoomCenterX, zoomCenterY, zoomRadius, shaderPaint); 
      canvas.drawLine(zoomCenterX - 20, zoomCenterY, zoomCenterX + 20, zoomCenterY, borderPaint); 
      canvas.drawLine(zoomCenterX, zoomCenterY - 20, zoomCenterX, zoomCenterY + 20, borderPaint); 
     } 
    } 

zoomCenterX и zoomCenterY фиксированные точки на холсте. Проблема заключается в том, что просмотр масштаба не сосредоточен на координатах currentMovedPoint (он смещен точно с помощью zoomCenterX, zoomCenterY). Если я установил zoomCenterX и zoomCenterY равным 0, изображение масштабирования будет правильно центрировано, но я не смогу использовать его, так как на экране появляется только четверть круга увеличения.

Я пробовал переводить shaderMatrix с помощью zoomCenterX и zoomCenterY без успеха (масштабирование по-прежнему не сосредоточено на выбранной в данный момент точке).

Я иду об этом не так, или есть что-то, что мне не хватает?

ответ

0

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

Так я добавил:

float[] centerPts = new float[2]; 
centerPts[0] = zoomCenterX; 
centerPts[1] = zoomCenterY; 
inverseMatrix.mapPoints(centerPts); 
shaderMatrix.postTranslate(-centerPts[0], centerPts[1]); 

после

shaderMatrix.postScale(2f, 2f);