2015-11-18 2 views
0

У меня есть растровое изображение, которое нужно рисовать на холст. Изображение имеет фиксированный размер, но холст будет меняться в зависимости от размера и плотности экрана пользователя (битмап-кулль будет больше/меньше холста).Рисование растрового изображения до размера холста

Мне нужно нарисовать растровое изображение до размера холста вплоть до размера холста (без искажения изображения), я сделал код, как показано ниже, но растровое изображение все еще заполняет только часть экрана.

Rect dest = new Rect(0, 0, drawCanvas.getWidth(), drawCanvas.getHeight()); 
Paint paint = new Paint(); 
paint.setFilterBitmap(true); 
drawCanvas.drawBitmap(canvasBitmap, null, dest, paint); 

Могу ли я узнать, может ли кто-нибудь пролить свет на хорошее решение? Благодарю.

ответ

0

Этот пример в JavaScript, но оно должно помочь вам масштабировать изображение

jsFiddle: https://jsfiddle.net/CanvasCode/7oghuwe2/3/

Javascript

var canvas1 = document.getElementById('canvas1'); 
var context1 = canvas1.getContext('2d') 
var canvas2 = document.getElementById('canvas2'); 
var context2 = canvas2.getContext('2d'); 

var image1 = new Image(); 
image1.src = "http://media.giphy.com/media/iNk83OBPzlA8o/giphy.gif"; 

image1.onload = function() { 
    context1.fillStyle = "#F00"; 
    context1.fillRect(0, 0, canvas1.width, canvas1.height); 
    context2.fillStyle = "#00F"; 
    context2.fillRect(0, 0, canvas2.width, canvas2.height); 
    ratio(context1, canvas1, image1); 
    ratio(context2, canvas2, image1); 
} 

function ratio(context1, canvas1, image1) { 
    var imageRatio = image1.width/image1.height; 

    var newHeight = canvas1.width/imageRatio; 
    var newWidth = canvas1.height * imageRatio; 

    var heightDiff = newHeight - canvas1.height; 
    var widthDiff = newWidth - canvas1.width; 

    if (widthDiff >= heightDiff) { 
     context1.drawImage(image1, 0, 0, canvas1.width, canvas1.width/imageRatio); 
    } else { 
     context1.drawImage(image1, 0, 0, canvas1.height * imageRatio, canvas1.height); 
    } 
} 

В основном вам нужно вычислить, что ширина будет, если вам масштабировало изображение по высоте холста и какова была бы высота, если вы масштабируете изображение по ширине холста и который когда-либо меньше, тогда вы масштабируетесь по этому размеру.

0

Причина, по которой это может не сработать для вас, может быть потому, что функция drawBitmap() игнорирует плотность растрового изображения. Ниже приведено значение documentation.

общественный недействительный drawBitmap (растровый точечный рисунок, Rect SRC, Rect ДСТ, Краска краски)

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


Что вы можете сделать, это вместо этого использовать public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint). Сначала вам нужно сопоставить исходную матрицу с матрицей разрешения. Вы делаете это через Matrix.setRectToRect() или Matrix.setPolyToPoly(). Это даст вам точное отображение. Просто убедитесь, что вы правильно их сопоставляете, иначе все будет искажено.

Для получения дополнительной информации см. Здесь: What code should I use with 'drawMatrix.setPolyToPoly' to manipulate and draw just a rectangular part of a bitmap, rather than the entire bitmap?

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