【问题标题】:how to turn an image sideways or upside-down?如何将图像侧向或倒置?
【发布时间】:2012-07-23 17:27:01
【问题描述】:

我有一个自定义视图,我正在使用 onDraw() 在我的画布上绘图。我正在此画布上绘制图像。

我想将图像倒置,就像在水平线上翻转一样作为参考。这与将图像旋转 180 度或 -180 度不同。

同样,我想镜像或侧向翻转,即使用垂直线作为枢轴或参考。同样,这与 canvas.rotate() 提供的不同。

我想知道该怎么做。我应该使用矩阵还是画布提供任何方法来做到这一点,比如“旋转”。

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    你不能直接用 Canvas 来做。在绘制位图之前,您需要实际修改位图(使用矩阵)。幸运的是,这是一个非常简单的代码:

    public enum Direction { VERTICAL, HORIZONTAL };
    
    /**
        Creates a new bitmap by flipping the specified bitmap
        vertically or horizontally.
        @param src        Bitmap to flip
        @param type       Flip direction (horizontal or vertical)
        @return           New bitmap created by flipping the given one
                          vertically or horizontally as specified by
                          the <code>type</code> parameter or
                          the original bitmap if an unknown type
                          is specified.
    **/
    public static Bitmap flip(Bitmap src, Direction type) {
        Matrix matrix = new Matrix();
    
        if(type == Direction.VERTICAL) {
            matrix.preScale(1.0f, -1.0f);
        }
        else if(type == Direction.HORIZONTAL) {
            matrix.preScale(-1.0f, 1.0f);
        } else {
            return src;
        }
    
        return Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
    }
    

    【讨论】:

    • 感谢代码 sn-p。在我想要翻转图像并使用 setImageResource 的地方,我简单地替换为:imageView.setImageBitmap(flip(BitmapFactory.decodeResource(getResources(), R.id.someimage),Direction.HORIZONTAL));
    • 我知道这已经很老了,但这只是救了我的培根。谢谢!
    • 您说这不能直接在Canvas 上完成是错误的。事实上,您用来创建新的Bitmap 的方法实际上是通过创建一个新的Canvas 并使用提供的尺寸和矩阵从源中绘制它来实现的。对于自定义视图,直接在onDraw() 中执行此操作会更有效地进行内存和处理。
    • @corsair992 我说的是你不能简单地旋转带有现有图像的画布 - 你需要重新绘制图像。我还提供了一种旋转图像的方法——无论你把代码放在 onDraw 还是其他任何地方——完全取决于你。
    • @AleksG:问题是关于在自定义视图中将图像直接绘制到 Canvas 上,在这种情况下,您可以在绘制时直接将矩阵应用到其上,而不必浪费额外的内存/处理创建一个新的Bitmap。即使没有在每个onDraw() 回调上执行此操作,它仍然是不必要且非最佳操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2023-03-15
    • 2018-01-15
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多