android 水平或垂直翻转位图图像

30byixjq  于 2023-05-27  发布在  Android
关注(0)|答案(6)|浏览(249)

通过使用此代码,我们可以旋转图像:

public static Bitmap RotateBitmap(Bitmap source, float angle) {
      Matrix matrix = new Matrix();
      matrix.postRotate(angle);
      return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}

但是我们如何水平或垂直翻转图像呢?

zphenhs4

zphenhs41#

假设cx,cy是图像的中心:
翻转x:

matrix.postScale(-1, 1, cx, cy);

在y方向翻转:

matrix.postScale(1, -1, cx, cy);

总计:

public static Bitmap createFlippedBitmap(Bitmap source, boolean xFlip, boolean yFlip) {
    Matrix matrix = new Matrix();
    matrix.postScale(xFlip ? -1 : 1, yFlip ? -1 : 1, source.getWidth() / 2f, source.getHeight() / 2f);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}
wtzytmuj

wtzytmuj2#

使用Kotlin和扩展函数:

// To flip horizontally:
fun Bitmap.flipHorizontally(): Bitmap {
    val matrix = Matrix().apply { postScale(-1f, 1f, width / 2f, height / 2f) }
    return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
}

// To flip vertically:
fun Bitmap.flipVertically(): Bitmap {
    val matrix = Matrix().apply { postScale(1f, -1f, width / 2f, height / 2f) }
    return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
}
q8l4jmvw

q8l4jmvw3#

Kotlin的短扩展

private fun Bitmap.flip(x: Float, y: Float, cx: Float, cy: Float): Bitmap {
    val matrix = Matrix().apply { postScale(x, y, cx, cy) }
    return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
}

和用法:
水平翻转:-

val cx = bitmap.width / 2f
val cy = bitmap.height / 2f
val flippedBitmap = bitmap.flip(-1f, 1f, cx, cy)
ivMainImage.setImageBitmap(flippedBitmap)

垂直翻转:-

val cx = bitmap.width / 2f
val cy = bitmap.height / 2f
val flippedBitmap = bitmap.flip(1f, -1f, cx, cy)
ivMainImage.setImageBitmap(flippedBitmap)
aelbi1ox

aelbi1ox4#

只需使用以下代码:

private fun setVerticalFlip() {
    if (binding.imgReal.scaleX == 1.0f) {
        binding.imgReal.scaleX = -1.0f
    } else {
        binding.imgReal.scaleX = 1.0f
    }
}

private fun setHorizontalFlip() {
    if (binding.imgReal.scaleY == 1.0f) {
        binding.imgReal.scaleY = -1.0f
    } else {
        binding.imgReal.scaleY = 1.0f
    }
}
vuv7lop3

vuv7lop35#

位图bms的水平和垂直翻转(源代码)。

Matrix matrix = new Matrix();
// for horizontal flip
matrix.setScale(-1, 1);
matrix.postTranslate( bms.getWidth(),0);
// for vertical flip
matrix.setScale( 1,-1);
matrix.postTranslate( 0, bms.getHeight());
Bitmap bm = Bitmap.createBitmap( bms, 0, 0, bms.getWidth(), bms.getHeight(), matrix, true);
ryhaxcpt

ryhaxcpt6#

这都是关于你使用的矩阵。若要围绕x轴翻转,请使用[[-1,0],[0,1]]。对于y轴,使用[[1,0],[0,-1]]。这里重要的是行列式的绝对值是1,所以它不会缩放。基本上是反转给定轴的位置。

相关问题