将位图绘制为画布的大小

时间:2015-11-18 08:07:54

标签: android bitmap android-canvas

我有需要绘制到画布的位图。图像具有固定大小,但画布将根据用户的屏幕大小和密度而改变(位图可能比画布更大/更小)。

我需要将位图绘制到画布缩放到画布大小(不扭曲图像),我已完成下面的代码,但位图仍然只填充屏幕的一部分。

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

我是否知道是否有人可以解决一个好的解决方案?感谢。

2 个答案:

答案 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()执行此操作。这将为您提供准确的映射。只要确保你正确映射它们,否则事情就会失真。

有关详细信息,请参阅此处:What code should I use with 'drawMatrix.setPolyToPoly' to manipulate and draw just a rectangular part of a bitmap, rather than the entire bitmap?