图像旋转代码有什么问题?

时间:2018-04-20 13:18:46

标签: java algorithm graphics rotation

图像旋转时代码如下,但错误,原始图像上会出现一些黑点。我相信它是旋转代码的东西。有解决方案吗谢谢。图像尺寸为32x32像素,加载在屏幕中心(320x240)。

ExternalProcess process = ProcessService.createExternalProcess(taskContext, new ExternalProcessBuilder().*command*(Arrays.asList("**/bin/ls**")). workingDirectory(fileWorkingDir));

2 个答案:

答案 0 :(得分:1)

初学者的错误(抱歉)。

依次获取每个源像素,将坐标转换为目标并复制像素值不正确。因为常规输入网格不会映射到规则网格,并且会出现空洞(和重叠)。

正确的方法是扫描目标图像(以便到达每个目标像素)并对坐标进行反变换以从源中获取像素值。

作为一种改进,您可以使用放置在源中的四个相邻像素并执行双线性插值,以减少混叠。

答案 1 :(得分:0)

伙计,这很奇怪,因为在这段代码中它运作正常!

下面是工作代码:

public class RendPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    int widthe  = 320;
    int heighte = 240;

    int ang = 0;
    double x0 = 0.5 * (widthe  - 1);     // point to rotate about
    double y0 = 0.5 * (heighte - 1);     // center of image

    public static BufferedImage fbuffer;
    public RendPanel(int width, int height) {
        fbuffer = new BufferedImage(320, 240, BufferedImage.TYPE_INT_RGB);

        BufferedImage in = null;
        try { in = ImageIO.read(new File("square.png")); } //32x32 square .png
        catch (IOException e) { e.printStackTrace(); }

        for (int i = 0; i < in.getWidth(); i++) {
            for (int j = 0; j < in.getHeight(); j++) {
                fbuffer.setRGB(i + (320 / 2) - 16, j + (240 / 2) - 16, in.getRGB(i, j));
            }
        }

        setPreferredSize(new Dimension(width, height));
    }

    BufferedImage neww;
    public void r(){
        neww = new BufferedImage(320, 240, BufferedImage.TYPE_INT_RGB);

        double angle = Math.toRadians(ang);
        double sin = Math.sin(angle);
        double cos = Math.cos(angle);

        for (int x = 0; x < widthe; x++) {
            for (int y = 0; y < heighte; y++) {
                if(x >= x0 - 32 && x <= x0 + 32 && y >= y0 - 32 && y <= y0 + 32){
                    double a = x - x0;
                    double b = y - y0;
                    int xx = (int) (+a * cos - b * sin + x0);
                    int yy = (int) (+a * sin + b * cos + y0);

                    // plot pixel (x, y) the same color as (xx, yy) if it's in bounds
                    if (xx >= 0 && xx < widthe && yy >= 0 && yy < heighte) {
                        neww.setRGB(x, y, fbuffer.getRGB(xx, yy));
                    }
                }
            }
        }

        ang++;
        repaint();
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(neww, 0, 0, null);
    }
}

感谢: https://introcs.cs.princeton.edu/java/31datatype/Rotation.java.html

编辑: 您必须将bf2.setRGB(x, y, fbuffer.getRGB(xx, yy));上的变量反转为旋转坐标。