Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Android Canvas.drawBitmapMesh会产生意外的位图转换_Android_Image Processing_Bitmap_Android Canvas_Android Bitmap - Fatal编程技术网

使用Android Canvas.drawBitmapMesh会产生意外的位图转换

使用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

使用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 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);