有什么方法可以旋转由像素值的二维数组表示的图像吗?
Is there any way to rotate an image represented by a two-dimensional array of pixel values?
我正在尝试将 Matlab 的 imrotate 函数的功能引入 Java。具体来说,由于我已经将图像的像素值存储在二维数组中,因此我想以指定的角度围绕其中心旋转该图像。我找到的大多数答案(使用 AffineTransform 和 Graphics2D 和 BufferedImage)都是面向图形的,我无法产生我需要的结果,因为我不需要在视觉上绘制它。比如下面的函数返回了一张所有像素值为0的图片(可视化部分我注释掉了)
public static BufferedImage rotateImage(BufferedImage img, double angle) {
double rads = Math.toRadians(angle);
double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads));
int w = img.getWidth();
int h = img.getHeight();
int newWidth = (int) Math.floor(w * cos + h * sin);
int newHeight = (int) Math.floor(h * cos + w * sin);
BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotated.createGraphics();
AffineTransform at = new AffineTransform();
at.translate((newWidth - w) / 2, (newHeight - h) / 2);
int x = w / 2;
int y = h / 2;
at.rotate(rads, x, y);
g2d.setTransform(at);
// g2d.drawImage(img, 0, 0, this);
// g2d.setColor(Color.RED);
// g2d.drawRect(0, 0, newWidth - 1, newHeight - 1);
// g2d.dispose();
return rotated;
非常感谢任何帮助或建议。另外,如果您需要更多详细信息,请告诉我。
更新:我想我应该更好地澄清我的问题。
所以我有一个指纹图像,我需要从中提取一个子图像。之后,我必须根据提供的角度旋转子图像。我尝试过的是:首先,将图像作为 BufferedImage 加载。然后,我将子图像提取为二维整数数组。最后,我需要应用旋转。当我做一些研究时,我知道这听起来很傻,我可能是这样,但我试图用子图像的 2d 数组创建一个 BufferedImage,然后用下面给出的方法旋转。然而,我没有成功。我期待听到您对我在概念上或程序上做错了什么的评论。非常感谢。
正如评论中指出的,以下答案可能对这个问题有用:
I have a code that shears the image but i would like it to rotate on the x and y axis with forward and backward mapping. Any advice on how to do this?
我正在尝试将 Matlab 的 imrotate 函数的功能引入 Java。具体来说,由于我已经将图像的像素值存储在二维数组中,因此我想以指定的角度围绕其中心旋转该图像。我找到的大多数答案(使用 AffineTransform 和 Graphics2D 和 BufferedImage)都是面向图形的,我无法产生我需要的结果,因为我不需要在视觉上绘制它。比如下面的函数返回了一张所有像素值为0的图片(可视化部分我注释掉了)
public static BufferedImage rotateImage(BufferedImage img, double angle) {
double rads = Math.toRadians(angle);
double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads));
int w = img.getWidth();
int h = img.getHeight();
int newWidth = (int) Math.floor(w * cos + h * sin);
int newHeight = (int) Math.floor(h * cos + w * sin);
BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotated.createGraphics();
AffineTransform at = new AffineTransform();
at.translate((newWidth - w) / 2, (newHeight - h) / 2);
int x = w / 2;
int y = h / 2;
at.rotate(rads, x, y);
g2d.setTransform(at);
// g2d.drawImage(img, 0, 0, this);
// g2d.setColor(Color.RED);
// g2d.drawRect(0, 0, newWidth - 1, newHeight - 1);
// g2d.dispose();
return rotated;
非常感谢任何帮助或建议。另外,如果您需要更多详细信息,请告诉我。
更新:我想我应该更好地澄清我的问题。 所以我有一个指纹图像,我需要从中提取一个子图像。之后,我必须根据提供的角度旋转子图像。我尝试过的是:首先,将图像作为 BufferedImage 加载。然后,我将子图像提取为二维整数数组。最后,我需要应用旋转。当我做一些研究时,我知道这听起来很傻,我可能是这样,但我试图用子图像的 2d 数组创建一个 BufferedImage,然后用下面给出的方法旋转。然而,我没有成功。我期待听到您对我在概念上或程序上做错了什么的评论。非常感谢。
正如评论中指出的,以下答案可能对这个问题有用:
I have a code that shears the image but i would like it to rotate on the x and y axis with forward and backward mapping. Any advice on how to do this?