0

次のコードを使用して、特定の画像を回転させています。

public int getImageWidth(BufferedImage img) {
        if (rotate == Rotate.UPSIDE_DOWN || rotate == Rotate.ABOUT_CENTER)
            return img.getWidth();
        else
            return img.getHeight();
    }





public int getImageHeight(BufferedImage img) {

        if (rotate == Rotate.UPSIDE_DOWN || rotate == Rotate.ABOUT_CENTER)
            return img.getHeight();
        else
            return img.getWidth();

    }

これは回転列挙型です

public enum Rotate {
        DOWN, UP, UPSIDE_DOWN, ABOUT_CENTER;
    }

実際の回転方法

public BufferedImage rotateImage(BufferedImage source, int x, int y,
            float orientation) throws Exception {

        int newWidth = getImageWidth(source);
        int newHeight = getImageHeight(source);
        int cWidth = newWidth / 2;
        int cHeight = newHeight / 2;
        int imgType = source.getType() == 0 ? 5 : source.getType();

        BufferedImage result = new BufferedImage(getImageWidth(source),
                getImageHeight(source),imgType);
        Graphics2D g2 = result.createGraphics();

        if (rotate == Rotate.DOWN) {
            g2.translate(x + cHeight, y + cWidth);
            g2.rotate(Math.toRadians(90));
            g2.drawImage(source, 0, 0, newWidth, newHeight, null);
        } else if (rotate == Rotate.UP) {
            g2.translate(x + cHeight, y + cWidth);
            g2.rotate(Math.toRadians(-90));
            g2.drawImage(source, 0, 0, newWidth, newHeight, null);
        } else if (rotate == Rotate.UPSIDE_DOWN) {
            g2.translate(x + cWidth, y + cHeight);
            g2.rotate(Math.toRadians(180));
            g2.drawImage(source, 0, 0, newWidth, newHeight, null);
        } else if (rotate == Rotate.ABOUT_CENTER) {
            Rectangle r = new Rectangle(x, y, newWidth, newHeight);
            g2.setClip(r);
            AffineTransform original = g2.getTransform();
            AffineTransform at = new AffineTransform();
            at.concatenate(original);
            at.rotate(orientation, x + cWidth, y + cHeight);
            g2.setTransform(at);
            g2.drawImage(source, 0, 0, newWidth, newHeight, null);
            g2.setTransform(original);
        }

        g2.dispose();
        g2 = null;

        return result;

    }

クライアントコード

// rotate derived & filtered image to 90 degree
        // using Affine transform
        setRotate(Rotate.UP);

        BufferedImage rSubImage = rotateImage(fSubImage, 0, 0, -90);

以下はソース画像です。

ソース画像

上記のコードを使用してこの画像を回転すると、結果は非常に奇妙です

間違った回転画像

私は何を間違えましたか?

また、回転後に品質が失われますので、ご了承ください。

4

1 に答える 1

0

解決策は、AffineTranform を使用して、イメージを変換して中央に配置することだと思います。私はあなたのコードを修正してテストしました。私にとってはうまくいきます:

public BufferedImage rotateImage(BufferedImage source, int x, int y,
        float orientation) throws Exception {

    int newWidth = getImageWidth(source);
    int newHeight = getImageHeight(source);
    int imgType = source.getType() == 0 ? 5 : source.getType();

    BufferedImage result = new BufferedImage(getImageWidth(source),
            getImageHeight(source), imgType);

    if (rotate == Rotate.DOWN) {

        AffineTransform tranform = new AffineTransform();
        tranform.translate(newWidth / 2, newHeight / 2);
        tranform.rotate(Math.toRadians(90));
        tranform.translate(-source.getWidth()/2, -source.getHeight()/2);
        Graphics2D g2d = result.createGraphics();
        g2d.drawImage(source, tranform, null);

    } else if (rotate == Rotate.UP) {

        AffineTransform tranform = new AffineTransform();
        tranform.translate(newWidth / 2, newHeight / 2);
        tranform.rotate(Math.toRadians(-90));
        tranform.translate(-source.getWidth()/2, -source.getHeight()/2);
        Graphics2D g2d = result.createGraphics();
        g2d.drawImage(source, tranform, null);

    } else if (rotate == Rotate.UPSIDE_DOWN) {

        AffineTransform tranform = new AffineTransform();
        tranform.translate(newWidth / 2, newHeight / 2);
        tranform.rotate(Math.toRadians(180));
        tranform.translate(-source.getWidth()/2, -source.getHeight()/2);
        Graphics2D g2d = result.createGraphics();
        g2d.drawImage(source, tranform, null);


    } else if (rotate == Rotate.ABOUT_CENTER) {

        //......

    }



    return result;

}

それが役に立てば幸い!

于 2013-08-23T08:10:00.300 に答える