2011-08-03 4 views
0

카메라 뷰는 이미지 뷰가 맨 위에 있고 매트릭스 변환을 사용하여 이미지를 화면 주위로 이동합니다. 사진을 찍을 때 위치와 스케일링을 올바르게 고려하여 이미지를 합성 할 수 있기를 원합니다. 사진은 단지 세로 방향이며 가로 방향 인 경우 회전됩니다.합성을 위해 변형 된 매트릭스 변환 된 이미지

public void onPictureTaken(byte[] data, Camera camera) { 

    BitmapFactory.Options opt = new BitmapFactory.Options(); 
    this.newPhoto = BitmapFactory.decodeByteArray(data, 0, data.length, opt); 

    int photoWidth = newPhoto.getWidth() > newPhoto.getHeight()?newPhoto.getHeight():newPhoto.getWidth(); 
    int photoHeight = newPhoto.getWidth() > newPhoto.getHeight()?newPhoto.getWidth():newPhoto.getHeight(); 

    //Preview is fullscreen 
    Display display = getWindowManager().getDefaultDisplay(); 
    int previewWidth = display.getWidth(); 
    int previewHeight = display.getHeight(); 


    float scale = (float)photoHeight/(float)previewHeight; 
    float scaleX = (float)photoWidth/(float)previewWidth; 

    Bitmap finished = Bitmap.createBitmap(photoWidth, photoHeight, newPhoto.getConfig()); 

    //Create canvas and draw photo into it 
    //[snip] 

    //Draw character onto canvas 
    int imageResource = getResources().getIdentifier(character + "large", "drawable", getPackageName()); 
    if (imageResource != 0) { 
     Bitmap character = BitmapFactory.decodeResource(this.getResources(), imageResource); 
     RectF rect = new RectF(); 
     float[] values = new float[9]; 

     matrix.getValues(values); 
     rect.left = values[Matrix.MTRANS_X] * scaleX; 
     rect.top = values[Matrix.MTRANS_Y] * scale; 
     //273x322 WidthxHeight of preview character image 
     rect.right = rect.left + (273 * values[Matrix.MSCALE_X]) * scale; 
     rect.bottom = rect.top + (322 * values[Matrix.MSCALE_Y]) * scale; 

     //Logging here 


     canvas.drawBitmap(character, null, rect, null); 
     character.recycle(); 
    } 


    System.gc(); 
    newPhoto = finished; 
    showDialog(DIALOG_PHOTO_RESULT); 
} 

로그 :

미리보기 : 480x854 사진 : 1536x2048

규모 : 2.3981264

매트릭스 : (112.45,375.85) 규모 : (1.00,1.00)

직선 : (359.8342,901.34326) w : 654.6885h : 772.1968

이미지 rect는 결과 합성 이미지의 문자가 위쪽/왼쪽과 너무 작고 너무 작아서 크기가 커지는 것 같지 않습니다.

답변

1

문제는 안드로이드가이었다이었다 내가 장치에 대한 이미지 스케일링 안드로이드 막을 수 있었다 drawable-nodpi 폴더에 캐릭터 이미지를 이동하여 내 모든 규모의 계산을

을 던졌다 문자 이미지를 미리 확장되도록 이미지를 카메라 뷰와 일치하도록 확대/축소 할 수 있습니다.

+0

또 다른 옵션은 'getScaledWidth()'를 사용하여 화면 dpi를 고려하는 것입니다 – Affian

관련 문제