在一个垂直边上倾斜图像

时间:2015-03-06 09:00:00

标签: android matrix graphics transformation skew

我试图将左侧的图像“歪斜”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);
    }

它做了一些事情,但它做的主要是放大到图像的左上角......

1 个答案:

答案 0 :(得分: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);
相关问题