Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.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 如何将位图绘制到另一个位图,但绘制到给定的四边形(不需要矩形)?_Android_Bitmap_Android Canvas_Tilt - Fatal编程技术网

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

Android 如何将位图绘制到另一个位图,但绘制到给定的四边形(不需要矩形)?,android,bitmap,android-canvas,tilt,Android,Bitmap,Android Canvas,Tilt,假设我有两个位图。一个是小位图,一个是大位图 /*use values accordingly*/ Matrix matrix = new Matrix(); matrix.postScale(curScale, curScale); matrix.postRotate(curRotate); matrix.postSkew(curSkewX, curSkewY); Bitmap resizedBitmap = Bitmap.createBitmap(b

假设我有两个位图。一个是小位图,一个是大位图

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
我想将整个smallBitmap绘制成largeBitmap,但只绘制成largeBitmap的一部分,而不是直接的正则表达式,而是绘制成一个

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
我认为草图最能描述我的意思:

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
这种情况的一个例子是倾斜的智能手机图像(如或),您需要将屏幕截图放入其屏幕中

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
输入是:smallBitmap,largeBitmap,largeBitmap的“四边形”坐标(放置smallBitmap的位置)

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
大位图的“四边形”只有4个坐标,不需要矩形。例如,它可以是平行四边形或梯形

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
我需要将小位图缩放为大位图中的四边形,并且还支持中心裁剪缩放,这样它就不会失真

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
我还需要知道如何以同样的方式对待文本,但我想这是相同的解决方案

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);

以下是我尝试过的一些东西,但它甚至无法扩展:

    //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());
   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);

要使位图倾斜,矩阵可能很方便

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
找到了基于的答案

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
似乎矩阵不能被使用,因为它不能创建在3d世界中可能出现的梯形形状

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
因此,建议使用“”类,例如:

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
    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());
可悲的是,正如您所看到的,坐标没有被使用,因此您需要处理这些数字直到正确为止,或者找到一个在坐标和所需值之间转换的公式

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
我不会将此答案标记为正确答案,因为它不完全符合原始问题的要求(没有使用坐标)

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
另外,在使用此解决方案时,我找不到如何处理文本

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
然而,它确实有效,因此它可能对其他人有用

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);

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

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
这是正确的代码:

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
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);
但是,对于中心裁剪,它仍然存在此问题,但是如果在矩形倾斜之前知道矩形的正确大小,则可以在倾斜之前进行裁剪,并将其设置为输入

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);

至于文本,这与往常一样是可能的,因为画布与创建的矩阵保持一致。

对于我的回答,我正在将较小的
位图绘制到较大的
位图上,然后将其绘制到
表面视图上

   /*use values accordingly*/
   Matrix matrix = new Matrix();
   matrix.postScale(curScale, curScale);  
   matrix.postRotate(curRotate);
   matrix.postSkew(curSkewX, curSkewY);

   Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
   myImageView.setImageBitmap(resizedBitmap);
  • 使用边界四边形创建边界矩形
  • 使用边框创建变换
    矩阵
  • 使用
    Matrix.ScaleToFit.CENTER
    将边框填充到较小的
    位图的最大可能大小
  • 完成这些步骤后,只需将较大的
    位图
    绘制到画布上即可。边界四边形绘制为红色,边界矩形绘制为蓝色,大的
    位图
    绘制为绿色。将较小的
    位图
    替换为蓝色的
    位图
    (边框)

       /*use values accordingly*/
       Matrix matrix = new Matrix();
       matrix.postScale(curScale, curScale);  
       matrix.postRotate(curRotate);
       matrix.postSkew(curSkewX, curSkewY);
    
       Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
       myImageView.setImageBitmap(resizedBitmap);
    

    我不知道倾斜和旋转值。仅显示其他位图矩形的目标坐标。更新了问题以使其更清晰。您可以将旋转值用作零,将缩放值用作(1,1),因为您不需要缩放或旋转。试试matrix.postSkew(float kx,float ky,float px,float py),其中px和py是轴坐标。我不需要创建另一个位图。我向大位图写入。另外,px和py只是2个浮点数,我有4个坐标。我该怎么处理它们呢?另外,倾斜会导致平行四边形的形状,但我不能使其具有梯形的形状。请参见Matrix.setpolytoply
    “可悲的是,正如您所看到的,坐标没有被使用,因此您需要使用数字直到正确为止,或者找到一个公式在坐标和所需值之间进行转换。”
    这是因为您使用了错误的API(
    摄影机
    ),正确的API是
    Matrix
    及其
    SetPolyTopoloy
    方法,该方法使用两个精确坐标数组:2D空间中的四个[x,y]点,正如您所看到的
    Camera
    API返回
    矩阵
    ,该矩阵由
    SetPolyTopoloy
    方法调用计算(如果它在内部使用
    setpolytoply
    code,我不会感到惊讶)@pskink如果你知道如何修复代码,请在新的答案中写一个备选答案。这就是我发现的。@pskink很遗憾,这是我已经尝试过的事情之一。你甚至可以在那里看到我的评论。这种解决方案不会缩放图像,也不会对其进行中心裁剪。因此,它似乎必须使用Camera API(我恐怕你在任何地方都找不到确切问题的答案,除非你稍微玩弄一下,例如通过调用
    Canvas.drawPoints
    并查看
    dst
    float数组的坐标)@对不起。英语不是我的主要语言。我不明白你的意思。你认为我仍然可以使用SetPolytoply吗?或者我真的需要使用摄像头API吗?Romain Guy说它可以满足,但这个方法不正确是什么意思?好像我已经试过了。让它伸展和做运动的部分在哪里中心裁剪拉伸?四边形真的只是用于边界吗?这会使小位图的变换完全不同!我来看看。我已经修改了我的答案,四边形现在被用作边界区域来创建边界矩形。我没有提到放置边框。看我显示的图像关于这个问题。我希望它能够进行缩放,并具有中心裁剪缩放功能。我还需要对文本进行缩放。例如,请查看智能手机的此图像:。现在,从I