【问题标题】:BufferedImage setRGB strange resultBufferedImage setRGB 奇怪的结果
【发布时间】:2016-11-09 11:23:36
【问题描述】:

我尝试使用setRGBBufferedImage 在Java 中旋转图像,但得到一个奇怪的结果。有人知道为什么吗?

 BufferedImage pic1 = ImageIO.read(new File("Images/Input-1.bmp"));
    int width  = pic1.getWidth(null);
    int height = pic1.getHeight(null);

    double angle = Math.toRadians(90);
    double sin = Math.sin(angle);
    double cos = Math.cos(angle);
    double x0 = 0.5 * (width  - 1);     // point to rotate about
    double y0 = 0.5 * (height - 1);     // center of image

    BufferedImage pic2 = pic1;

    // rotation
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            double a = x - x0;
            double b = y - y0;
            int xx = (int) (+a * cos - b * sin + x0);
            int yy = (int) (+a * sin + b * cos + y0);

            if (xx >= 0 && xx < width && yy >= 0 && yy < height) {
                pic2.setRGB(x, y, pic1.getRGB(xx, yy));
            }
        }
    }
    ImageIO.write(pic2, "bmp", new File("Images/Output2.bmp"));

LEFT 一侧是原始图片,RIGHT 一侧是我的结果。有谁知道我该如何解决?

感谢您的帮助。

【问题讨论】:

  • 您无法原地旋转图像。您制作另一个单独的旋转图像。如果要将图像旋转 90 度,则不必进行旋转数学运算。只需将 x 坐标复制到新的 y 坐标,将 y 坐标复制到新的 x 坐标即可。

标签: java image image-processing bufferedimage


【解决方案1】:

问题是您使用相同的图像作为输入和输出:

缓冲图像 pic2 = pic1;

您必须为 pic2 创建另一个图像,然后进行旋转,将像素从 Image1 复制到 Image2。

但是请注意,使用 getRGB 和 setRGB 会非常慢。如果直接操作像素,速度会快 100 倍。

【讨论】:

  • 谢谢我没有注意到这个错误:D 现在它可以工作了。关于 setRBG 和 getRGB...我知道它们很慢....但我不知道如何将图像转换为像素 [][] 之类的东西。我在互联网上搜索了所有地方,我所看到的都是如何从图像中获取一维数组,我的意思是像素 []。但是我需要一个像像素[][]这样的二维数组,但我不知道如何获得它....你能帮我解决这个问题吗? :D
  • 在这个中,您使用像素创建图像:stackoverflow.com/questions/8856569/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 2012-12-16
  • 2012-12-06
  • 2016-08-24
相关资源
最近更新 更多