gpt4 book ai didi

android - 如何将位图绘制到另一个位图,但绘制到给定的四边形(不一定是矩形)?

转载 作者:行者123 更新时间:2023-11-30 01:56:07 25 4
gpt4 key购买 nike

假设我有 2 个位图。一种是 smallBitmap,一种是 largeBitmap。

我想将整个 smallBitmap 绘制到 largeBitmap 中,但只绘制到 largeBitmap 的一部分,而不是直接绘制成一个 quadrilateral

我认为草图最能说明我的意思:

enter image description here

这种情况的一个例子是倾斜的智能手机图像(如 thisthis ),您需要将屏幕截图放到它的屏幕上。

输入是:smallBitmap,largeBitmap,largeBitmap的“四边形”坐标(smallBitmap放在哪里)。

largeBitmap 的“四边形”只有 4 个坐标,不一定是矩形。例如,它可以是平行四边形或梯形。

我需要将smallBitmap缩放到largeBitmap中的四边形,同时支持center-crop缩放,这样才不会变形

我还需要知道如何以同样的方式处理文本,但我想这是关于相同的解决方案。


这是我尝试过的东西,但它甚至无法扩展:

    //mBigBitmap: size is 720x1280
//mSmallBitmap: size is 720x720
mLeftTop = new Point(370, 358);
mRightTop = new Point(650, 384);
mLeftBot = new Point(375, 972);
mRightBot = new Point(660, 942);
Canvas canvas = new Canvas(mBigBitmap);
final Matrix matrix = new Matrix();
matrix.setPolyToPoly(new float[]{0, 0,
mBigBitmap.getWidth() - 1, 0,
0, mBigBitmap.getHeight() - 1,
mBigBitmap.getWidth() - 1, mBigBitmap.getHeight() - 1},
0,
new float[]{mLeftTop.x, mLeftTop.y,
mRightTop.x, mRightTop.y,
mLeftBot.x, mLeftBot.y,
mRightBot.x, mRightBot.y
}
, 0, 4);
canvas.drawBitmap(mSmallBitmap, matrix, new Paint());

最佳答案

根据 this post 找到答案.

似乎不能使用 Matrix,因为它不能创建可以在 3d 世界中出现的梯形形状。

因此建议使用“Camera”类,如下所示:

    Canvas canvas = new Canvas(bigBitmap);
Matrix matrix = new Matrix();
Camera camera = new Camera();
camera.save();
camera.translate(...,...,0);
camera.rotateX(...);
camera.rotateY(...);
camera.rotateZ(...);
camera.getMatrix(matrix);
int centerX = bigBitmap.getWidth() / 2;
int centerY = bigBitmap.getHeight() / 2;
matrix.preTranslate(-centerX, -centerY); //This is the key to getting the correct viewing perspective
matrix.postTranslate(centerX, centerY);
canvas.concat(matrix);
camera.restore();
canvas.drawBitmap(mSmallBitmap, matrix, new Paint());

遗憾的是,如您所见,坐标未被使用,因此您需要使用数字直到正确为止,或者找到一个公式在坐标和所需值之间进行转换。

我不会将此答案标记为正确答案,因为它不完全符合原始问题的要求(未使用坐标)。

另外,在使用此解决方案时我找不到如何处理文本。

但是,它确实有效,所以它可能对其他人有用。


编辑:似乎 setPolyToPoly 根本不缩放图像的原因是第一个输入数组不正确:它被设置为大位图的大小,而不是小位图的大小。

所以,这是正确的代码:

mLeftTop = new Point(370, 358);
mRightTop = new Point(650, 384);
mLeftBot = new Point(375, 972);
mRightBot = new Point(660, 942);
Canvas canvas = new Canvas(mBigBitmap);
final Matrix matrix = new Matrix();
matrix.setPolyToPoly(new float[]{0, 0,
mSmallBitmap.getWidth() - 1, 0,
0, mSmallBitmap.getHeight() - 1,
mSmallBitmap.getWidth() - 1, mSmallBitmap.getHeight() - 1},
0,
new float[]{mLeftTop.x, mLeftTop.y,
mRightTop.x, mRightTop.y,
mLeftBot.x, mLeftBot.y,
mRightBot.x, mRightBot.y
}
, 0, 4);
canvas.concat(matrix);
final Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawBitmap(mSmallBitmap, 0, 0, paint);

然而,对于中心裁剪,它仍然存在这个问题,但是如果你知道矩形在倾斜之前的正确大小,你可以在之前进行裁剪,并将其设置为输入。

至于文本,这和往常一样是可能的,因为 Canvas 保留在创建的矩阵中。

关于android - 如何将位图绘制到另一个位图,但绘制到给定的四边形(不一定是矩形)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32180534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com