Масштабирование матрицы преобразованных изображений для композитинга - PullRequest
0 голосов
/ 04 августа 2011

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

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) ш: 654,6885 ч: 772,1968

Изображение прямоугольноене похоже, что масштабирование достаточно велико, так как получающееся составное изображение имеет символ слишком далеко к верхнему / левому краю и слишком маленький.

1 Ответ

1 голос
/ 04 августа 2011

Проблема состояла в том, что андроид предварительно масштабировал изображения персонажей, которые отбрасывали все мои вычисления масштаба

Переместив изображения персонажей в папку drawable-nodpi, я смог остановить масштабирование изображений Android для Android, чтобы изображения можно было масштабировать в соответствии с изображениями камеры.

...