Java初学者协调超出范围

时间:2017-04-03 19:42:37

标签: java

我一直在学习如何旋转图片,我必须将图片旋转180度和270度。我还没有开始使用270,我似乎无法弄清楚如何修复越界错误。

public Picture rotate180()
{
    Picture rotated = new Picture ();

    for (int x = 0, roty = 0; x < getWidth(); x++, roty++)
    {
      for (int y = 0, rotx = getWidth()-1; y<getHeight(); y++, rotx--)
      {
        Pixel oldPixel = getPixel(x,y);
        Pixel newPixel = getPixel(rotx,roty);
        newPixel.setColor(oldPixel.getColor());
      }
    }
return rotated;
}

3 个答案:

答案 0 :(得分:1)

private enum Degree {
    _90_ {
        public Picture rotate(Picture picture) {
            Picture res = swapRowCol(new Picture(picture.height, picture.width), picture);

            // mirror each column
            for (int col = 0; col < res.width; col++)
                for (int row1 = 0, row2 = res.height - 1; row1 < row2; row1++, row2--)
                    swapColor(res, col, row1, col, row2);

            return res;
        }
    },
    _180_ {
        public Picture rotate(Picture picture) {
            Picture res = new Picture(picture.width, picture.height);

            // desc rows and mirror each one
            for (int row1 = 0, row2 = res.height - 1; row1 < res.height; row1++, row2--)
                for (int col1 = 0, col2 = picture.width - 1; col1 < picture.width; col1++, col2--)
                    res.getPixel(col2, row2).setColor(picture.getPixel(col1, row1).getColor());

            return res;
        }
    },
    _270_ {
        public Picture rotate(Picture picture) {
            Picture res = swapRowCol(new Picture(picture.height, picture.width), picture);

            // mirror each row
            for (int row = 0; row < res.height; row++)
                for (int col1 = 0, col2 = res.width - 1; col1 < col2; col1++, col2--)
                    swapColor(res, col1, row, col2, row);

            return res;
        }
    };

    public abstract Picture rotate(Picture picture);

    protected static Picture swapRowCol(Picture dst, Picture src) {
        // (x;y) -> (y;x)
        for (int row = 0; row < src.height; row++)
            for (int col = 0; col < src.width; col++)
                dst.getPixel(row, col).setColor(src.getPixel(col, row).getColor());

        return dst;
    }

    protected static void swapColor(Picture res, int srcCol, int srcRow, int dstCol, int dstRow) {
        Pixel pixel1 = res.getPixel(srcCol, srcRow);
        Pixel pixel2 = res.getPixel(dstCol, dstRow);
        int color = pixel1.getColor();
        pixel1.setColor(pixel2.getColor());
        pixel2.setColor(color);
    }
}

答案 1 :(得分:1)

在更一般的情况下,要旋转到任何角度,您必须使用 javax.imageio。*

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;

public final class ImageUtils {
    public static BufferedImage rotateImage(BufferedImage image, int degreeAngle) {
        degreeAngle = normalizeAngle(degreeAngle);

        if (degreeAngle == 0 || image == null)
            return image;

        double theta = Math.toRadians(degreeAngle);
        double cosTheta = Math.abs(Math.cos(theta));
        double sinTheta = Math.abs(Math.sin(theta));
        int width = (int)Math.rint(image.getWidth() * cosTheta + image.getHeight() * sinTheta);
        int height = (int)Math.rint(image.getWidth() * sinTheta + image.getHeight() * cosTheta);
        Graphics2D graphics = null;

        try {
            AffineTransform at = new AffineTransform();
            BufferedImage rotatedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            graphics = rotatedImage.createGraphics();

            at.rotate(theta, image.getWidth() / 2, image.getHeight() / 2);
            at.preConcatenate(balanceImagePosition(at, image));

            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            graphics.drawRenderedImage(image, at);

            return rotatedImage;
        } finally {
            if (graphics != null)
                graphics.dispose();
        }
    }

    /**
     * Transform given angle in degree of any range to the [0;360) range
     *
     * @param degreeAngle angle in degree
     * @return normalized angle in degree
     */
    private static int normalizeAngle(int degreeAngle) {
        if (degreeAngle <= -360 || degreeAngle >= 360)
            degreeAngle %= 360;
        if (degreeAngle < 0)
            degreeAngle += 360;

        return degreeAngle;
    }

    private static AffineTransform balanceImagePosition(AffineTransform at, BufferedImage image) {
        Point2D[] points = { new Point2D.Double(0, 0), new Point2D.Double(image.getWidth(), 0), new Point2D.Double(0,
                image.getHeight()), new Point2D.Double(image.getWidth(), image.getHeight()) };
        double tx = image.getWidth();
        double ty = image.getHeight();

        for (Point2D point : points) {
            Point2D tmp = at.transform(point, null);
            tx = Math.min(tx, tmp.getX());
            ty = Math.min(ty, tmp.getY());
        }

        at = new AffineTransform();
        at.translate(-tx, -ty);

        return at;
    }
}

答案 2 :(得分:0)

如上所述,你的for循环没有对Picture旋转做任何事情。我假设你的&#34; getWidth()&#34;呼叫应该得到旋转的宽度&#39;。如果是这样,那么您需要使用rotate.getWidth()来访问该属性。在其余代码中也使用相同的方法。 rotated.getHeight(); rotated.getPixel (x, y) 等等 另外,你在for循环中使用两个int值作为增量总是相等的,你可以使用它。