使用Android Canvas.drawBitmapMesh会产生意外的位图转换
使用Canvas.drawBitmapMesh,我可以更改图像以模拟透视图更改,但更改图像的方式出乎意料 原始图像>变换图像 >>>>>>>逐个变换>>>> int[]四个点与myBitmap的尺寸匹配,但左上角点向右移动,右上角点向左移动使用Android Canvas.drawBitmapMesh会产生意外的位图转换,android,image-processing,bitmap,android-canvas,android-bitmap,Android,Image Processing,Bitmap,Android Canvas,Android Bitmap,使用Canvas.drawBitmapMesh,我可以更改图像以模拟透视图更改,但更改图像的方式出乎意料 原始图像>变换图像 >>>>>>>逐个变换>>>> int[]四个点与myBitmap的尺寸匹配,但左上角点向右移动,右上角点向左移动 POINT: 768.0, 0.0 POINT: 2304.0, 0.0 POINT: 0.0, 2304.0 POINT: 3072.0, 2304.0 请注意,右上方的图像有一个意外的对角线“折叠”。这与我在下面生成的不使用Android Canvas
POINT: 768.0, 0.0
POINT: 2304.0, 0.0
POINT: 0.0, 2304.0
POINT: 3072.0, 2304.0
请注意,右上方的图像有一个意外的对角线“折叠”。这与我在下面生成的不使用Android Canvas drawBitmapMesh的图像相反
预期的转变:
我将上述预期结果称为“平滑线”转换
增目
我尝试将变换定义的网格增加到2乘2的大小。它掩盖了问题,但“褶皱”的问题仍然存在
二乘二网格
int[]九点与底部myBitmap的尺寸相匹配,但其余的调整为创建梯形
POINT: 768.0, 0.0
POINT: 1536.0, 0.0
POINT: 2304.0, 0.0
POINT: 384.0, 1152.0
POINT: 1536.0, 1152.0
POINT: 2688.0, 1152.0
POINT: 0.0, 2304.0
POINT: 1536.0, 2304.0
POINT: 3072.0, 2304.0
从编码的角度来看,不断增加网格的大小直到接近“平滑线”的结果是没有问题的,但这似乎会浪费CPU处理。也许有一个技巧可以让这个函数达到我所期望的效果,而不是对角线的“折叠”线?所以我想知道是否有一种方法可以一个接一个地制作网格,并获得可能更有效的“平滑线”。对此,您必须使用透视矩阵 初始将源点转换为目标点的矩阵应为4点:
Matrix m = new Matrix();
m.setPolyToPoly(srcPoints,0,dstPoints,0,4)
其中,源点和目标点是表示为{x1,y1,x2,y2,x3,y3,x4,y4}的点的浮点数组
然后用
canvas.drawBitmapMesh(myBitmap, m, null);
null可以被定义为使用抗锯齿过滤器的Paint对象替换。将最后一个参数设置为4,并对src和dst使用大小为8的float[]后,这与预期的转换一样有效,转换为具有平滑线条的梯形
Matrix m = new Matrix();
m.setPolyToPoly(srcPoints,0,dstPoints,0,4)
canvas.drawBitmapMesh(myBitmap, m, null);