Java2D图像轮换问题 [英] Java2D Image Rotation Issue

查看:146
本文介绍了Java2D图像轮换问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下代码来旋转给定的图像。

I am using following code to rotate an given image.

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);

现在以下是源图像,

当我旋转此图像时使用上面的代码,结果很奇怪

When i rotate this image using above code , the result is very strange

我做错了什么?

轮换后质量也会丢失,请注意。

推荐答案

我认为解决方案是使用AffineTranform,将Image翻译成中心的reamin。我修改了你的代码并对其进行了测试,对我来说它是有效的:

I think the solution is to use AffineTranform, translating the Image to reamin in the center. I modified your code and tested it, for me it works:

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;

}

希望有所帮助!

这篇关于Java2D图像轮换问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆