版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433439
对图像矩阵原地旋转(In-place matrix transposition)的好处就是不用占用额外内存,所以在一些资源比较紧张的应用场景,原地旋转就显得必要了。
参照这篇文章:《opencv图像原地(不开辟新空间)顺时旋转90度》,我实现了java代码,90,270度。
原理就不详述了,上面这篇文章讲得已经很清楚,
以下是实现代码:
/**
* 图像顺时针旋转90度
* @param input
* @param width
* @param height
* @param bpp
*/
public static void rotate90(byte[] input,int width,int height,int bpp) {
if (input.length != width * height * bpp) {
throw new IllegalArgumentException("INVALID INPUT SIZE");
}
byte[] tmp = new byte[bpp];
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
int I = height - 1 - j;
int J = i;
while ((i*height + j) > (I*width + J))
{
int p = I*width + J;
int tmp_i = p / height;
int tmp_j = p % height;
I = height - 1 - tmp_j;
J = tmp_i;
}
swap(input,(i*height + j)*bpp, (I*width + J)*bpp, bpp, tmp);
}
}
}
/**
* 图像顺时针旋转270度
* @param input
* @param width
* @param height
* @param bpp
*/
public static void rotate270(byte[] input,int width,int height,int bpp) {
if (input.length != width * height * bpp) {
throw new IllegalArgumentException("INVALID INPUT SIZE");
}
byte[] tmp = new byte[bpp];
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
int I = j;
int J = width - 1 - i;
while ((i*height + j) > (I*width + J))
{
int p = I*width + J;
int tmp_i = p / height;
int tmp_j = p % height;
I = tmp_j;
J = width - 1 - tmp_i;
}
swap(input,(i*height + j)*bpp, (I*width + J)*bpp, bpp, tmp);
}
}
}
/**
* 对数据array中x和y指向的数据交换
* @param array
* @param x
* @param y
* @param size 数据交换长度
* @param tmp 用于数据交换的临时缓冲区,长度必须>= size
*/
private static void swap(byte[] array,int x,int y, int size, byte[] tmp){
System.arraycopy(array, x, tmp, 0, size);
System.arraycopy(array, y, array, x, size);
System.arraycopy(tmp, 0, array, y, size);
}
完整代码参见gitee仓库:https://gitee.com/l0km/jimgutil/blob/master/jimgutil/src/main/java/gu/jimgutil/CsCvtUniImpl.java
测试代码参见:https://gitee.com/l0km/jimgutil/blob/master/jimgutil/src/test/java/gu/jimgutil/RotateTest.java