2016-11-25 3 views
0

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

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

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

public Bitmap mergeImageAndCanvas(Bitmap bitmap) { 

    // DRAW TO Canvas created in constructor 
    canvasImage.setBitmap(bitmap); 
    render(canvasImage, true); 
    canvasImage.setBitmap(null); 
    System.out.println("Canvas " + canvas.getWidth() + ", height " + canvas.getHeight()); 

    return bitmap; 
} 

Здесь я Высококлассный и попытаться центром изображения, чтобы сохранить точное положение текста и линии я рисовать

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    // Toast.makeText(getContext(), "Surfaceview surfaceChanged() width " + 
    // width + ", height" + height, 
    // Toast.LENGTH_LONG).show(); 
    bitmapWitdh = photoHandler.photoWidth; 
    bitmapHeight = photoHandler.photoHeight; 
    canvasWidth = width; 
    ratioX = (float) canvasWidth/1280; 
    canvasHeight = height; 
    scaleX = ((float) bitmapWitdh)/(float) canvasWidth; 
    scaleY = ((float) bitmapHeight)/(float) canvasHeight; 
    float middleX = bitmapWitdh/2.0f; 
    float middleY = bitmapHeight/2.0f; 
    scaleMatrix = new Matrix(); 
    // scaleMatrix.preScale(scaleX, scaleY); 
    scaleMatrix.setScale(scaleX, scaleY, middleX, middleY); 
    // scaleMatrix.postTranslate(-(bitmapWitdh)/2, -(bitmapHeight)/2); 
    // scaleMatrix.setTranslate(300, 300); 
    canvasImage.setMatrix(scaleMatrix); 
} 

Вот то, что я хочу для того чтобы достигнуть после высококлассного (Это то, что пользователь видит на экране с разрешением 1280x720) Image Screen

Th (разрешение изображения 2560x1920) Final image

+0

'затем получить это изменяемое растровое изображение из потока. Извините, вы пошли быстро. Из какого потока? С камеры? – greenapps

+0

У меня нет проблем с получением растрового изображения с камеры. Проблема начинается после ее получения и установки в качестве растрового изображения для холста. Да получить растровое изображение по данным метода onPictureTaken. Используйте опцию inMutable, чтобы сделать ее пригодной для рисования на ней с помощью холста. Но преобразование разрешения - это то, где я терпит неудачу. – Thracian

+0

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

ответ

0

Решение для масштабирования холста для любого разрешения - это просто масштабировать его с помощью метода Canvas.setScale(). Матричное масштабирование применяется от источника, которое по умолчанию (0,0), слева вверху экрана, преобразует измерение холста в любое другое измерение с помощью коэффициентов scaleX и scaleY, которые вы получаете от деления желаемого разрешения (размеры захваченного изображения из камера) по разрешению (разрешение устройства) по ширине и высоте.

В основном это соответствует размеру захваченного изображения и экрана устройства.

Смежные вопросы