沿一个垂直边缘倾斜图像

3
我想在左侧将一张图片“倾斜”10%,这样看起来就像它被稍微旋转了一下。我认为最简单的方法是创建一个自定义的“skewedimageview”,它扩展了ImageView并具有覆盖的setFrame方法。
更明确地说,这就是我想要的: skewed image on left side vertical 虽然我尝试了很多可能的矩阵组合,并尝试设置setSkew(听起来像是我想要的)。我尝试过定义和不定义枢轴点,但两者都没有成功。我也不确定选择哪个点作为枢轴点:它应该是一个保持不变的点,但我认为在这种转换中有很多不变的点(完整的右侧和水平中心线)。
我还尝试了 mapPoints,只是将左上角向下移动 5%,将右下角向上移动 5%,但似乎也不起作用。
     @Override
    protected boolean setFrame(int frameLeft, int frameTop, int frameRight, int frameBottom) {


        Matrix matrix = getImageMatrix();

        matrix.setSkew(1f,0.9f);

        setImageMatrix(matrix);
        return super.setFrame(frameLeft, frameTop, frameRight, frameBottom);
    }

}

有人有想法如何修复这个问题,使用setSkew或mapPoints的最佳实践是什么?或者手动创建变换矩阵(但我认为这比使用这些方法要困难得多)。

编辑:pskink所建议,我使用了函数setpoly2poly,如下所示:

 @Override
    protected boolean setFrame(int frameLeft, int frameTop, int frameRight, int frameBottom) {
        float height = frameBottom - frameTop;
        float width = frameRight - frameLeft;
        System.out.println("Height is "+height);
        int dy=0.05*height;

        Matrix matrix = getImageMatrix();
        float[] startpoints = {0,0,0,height}; //{0,0} =top left, {0,height}= left bottom
        float[] endpoints = {0,0+dy,0,height-dy}; //topleft 5% down, bottom left 5% up
          matrix.setPolyToPoly(startpoints,0,endpoints,0,2);
        setImageMatrix(matrix);
        return super.setFrame(frameLeft, frameTop, frameRight, frameBottom);
    }

它有一些功能,但主要的功能是将图像缩放到左上角...


Matrix.setPolyToPoly() - pskink
顺便提一下,您不需要自定义ImageView:只需将scaleType设置为“matrix”,并使用setPolyToPoly()设置矩阵即可。 - pskink
谢谢,我尝试了setpoly2poly函数,见帖子中的编辑...我正在使用一个ImageView来简单地重用这个变换。通过将ImageView更改为XML中的自定义视图,我自动获得了所需的倾斜图像,因为我在多个地方使用它,所以很容易。 - Jasper
请使用更多的标点符号,仅使用2个是绝对不够的。 - pskink
1个回答

1
我曾面临这个问题并找到了解决方案~!
Bitmap bitmap = addWhiteBorder(bitmapsrc, 2);
Matrix matrix2 = new   Matrix();
int oldw = bitmap.getWidth();
int oldh =  bitmap.getHeight(); 
float d_up = oldh / 20; 
float d_down = d_up + 10;
float[] src2 = new float[] { 0, 0, oldw, 0, oldw,
                                oldh, 0, oldh };
float[] dst2 = new float[] { 0, d_up, oldw, 0,
                                oldw, oldh, 0, oldh - d_down };
matrix2.setPolyToPoly(src2, 0, dst2, 0,
                                src2.length >> 1);
Bitmap bMatrix2 = Bitmap.createBitmap(bitmap, 0, 0,
                                bitmap.getWidth(), bitmap.getHeight(),
                                matrix2, true);                         
imBookCover.setImageBitmap(bMatrix2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接