我有需要绘制到画布的位图。图像具有固定大小,但画布将根据用户的屏幕大小和密度而改变(位图可能比画布更大/更小)。
我需要将位图绘制到画布缩放到画布大小(不扭曲图像),我已完成下面的代码,但位图仍然只填充屏幕的一部分。
Rect dest = new Rect(0, 0, drawCanvas.getWidth(), drawCanvas.getHeight());
Paint paint = new Paint();
paint.setFilterBitmap(true);
drawCanvas.drawBitmap(canvasBitmap, null, dest, paint);
我是否知道是否有人可以解决一个好的解决方案?感谢。
答案 0 :(得分: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);
}
}
基本上你需要计算如果用画布高度缩放图像时的宽度是什么,如果用画布宽度缩放图像的高度是多少,哪个更小,那么你按照那个尺寸缩放
答案 1 :(得分:0)
它可能不适合您的原因可能是因为函数drawBitmap()
忽略了位图的密度。以下内容来自documentation。
public void drawBitmap(位图位图,Rect src,Rect dst,Paint 漆)强>
此函数忽略与位图关联的密度。这是 因为源和目标矩形坐标空间在 他们各自的密度,所以必须已经适当 应用比例因子。
您可以使用public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)
代替。首先,您需要使用设定矩阵映射源矩阵。您可以通过Matrix.setRectToRect()
或Matrix.setPolyToPoly()
执行此操作。这将为您提供准确的映射。只要确保你正确映射它们,否则事情就会失真。