在java中旋转图像

时间:2014-02-12 02:22:29

标签: java image image-processing

我的图像高度= 576,宽度= 768,我将其像素信息存储在矩阵I [高度] [宽度]中。现在我想围绕它的中心旋转图像。当我们加载图像时,左上角实际上是(0,0)。因此,我将原点设置为中心(384,288)并应用公式:x'= xcos(theta)+ ysin(theta)和y'= -xsin(theta)+ ycos(theta)(http://en.wikipedia.org/wiki/Transformation_matrix

以下是我的代码:

/*  ROTATION REQUIRED */
        for(i2=0;i2<height2;i2++)
        {
            for(j2=0;j2<width2;j2++)
            {
                x_origin=j2 + (width2/2);
                y_origin=i2 + (height2/2);
                x_transformed=(int)(x_origin*Math.cos(radians) + y_origin*Math.sin(radians));
                y_transformed= (int)(-x_origin*Math.sin(radians) + y_origin*Math.cos(radians));
                x_new = x_transformed- (width2/2);
                y_new = y_transformed- (height2/2);
                pix=hw1.Image2[i2][j2]; /*pixel info of original image */
                hw1.img2.setRGB(x_new, y_new, pix);

当我进行此计算时,我的y_transformed结果是负数(因此为y_new),因此,setRGB()函数会抛出Coordinate Out Of Bound Of Exception。

任何人都可以指导我在哪里做错了吗?

由于

1 个答案:

答案 0 :(得分:2)

旋转图像时,将角旋转为负y(以及X)坐标。考虑围绕其中心旋转45度的正方形。顶部和左侧角落将从包含它们的盒子中伸出。

Unrotated square
 rotated square

这在数学上不是问题,但它是Java图形框架的问题。

以数学方式进行旋转,找到最小的x和y,然后将旋转的形状转换为足以使X和Y不再为负值,然后再在java图形框架中设置坐标。

或者,不要绘制任何小于0(X或Y)的点,这些点会从旋转的图像中裁剪掉部分。