【问题标题】:Java Fullscreen Image resizing?Java全屏图像调整大小?
【发布时间】:2015-02-10 10:04:51
【问题描述】:

您好,我是 java 新手。我正在开发一款游戏。当游戏开始时,会出现一个加载屏幕,然后就这样消失了。我的问题很简单。有没有办法改变图像大小以适应计算机屏幕的大小。我希望它适合所有类型的屏幕尺寸,并且是原始图像的更大比例。到目前为止,这是我的主要课程(还有其他课程,例如 player 和 title 和 play 但它们与问题无关:

package Main;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Comp extends Canvas implements Runnable, KeyListener {

    private static final long serialVersionUID = 1L;    
    public boolean run = true;
    public Image screen, img;    
    public static double dir = 5;
    public static int pixelSize = 1;    
    public static Dimension size = new Dimension(680, 500);
    public static Dimension pixel = new Dimension(size.width / pixelSize,
            size.height / pixelSize);    
    public static int mx;    
    public static manager m;
    public static int my;
    public static int fps;    
    public static boolean mr;    
    public static boolean ml;

    JFrame frame = new JFrame();    
    public Thread t;    
    public boolean splashscreen = true;
    public int time = 0;
    public int timer = 140;    
    public int btime = 0;
    public int btimer = 1;     
    private int FPS = 5;
    private long targetTime = 1000 / FPS;

    public Comp() {
        setPreferredSize(size);
        setFocusable(true);
        addKeyListener(this);    
        addKeyListener(new listen());
        addMouseListener(new listen());
        addMouseMotionListener(new listen());
        addMouseWheelListener(new listen());    
        m = new manager();
        requestFocus();    
        // h = new InputHandler(this);
    }

    public void start() {
        run = true;    
        frame.add(this);    
        frame.pack();
        frame.requestFocus();    
        frame.setTitle("In The Maze");
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);    
        frame.setIconImage(new ImageIcon("res/traps/beartrap1.png").getImage());    
        t = new Thread(this);
        t.start();
    }

    public void stop() {
        run = false;    
    }

    public static void main(String[] args) {
        Comp c = new Comp();    
        c.start();
    }

    public void render() {
        BufferStrategy bs = this.getBufferStrategy();
        if (bs == null) {
            createBufferStrategy(2);
            return;
        }
        Graphics g = bs.getDrawGraphics();
        g.setColor(Color.white);
        g.fillRect(0, 0, 1000, 1000);    
        if (!splashscreen) {    
            m.render(g);
        }           
        if(splashscreen){
            ImageIcon i62 = new ImageIcon("res/splashscreen.png");
            img = i62.getImage();
            g.drawImage(img,(int)0 ,(int)0,Comp.size.width+10,Comp.size.height + 10,null);            
            time++;
        }    
        g.dispose();    
        bs.show();
    }

    public void tick() {
        if(time >= timer){
            time = 0;
            splashscreen = false;
        }

        if(!splashscreen){
            m.tick();
        }
        Keys.update();
        Esentials.tick();    
    }

    public void run() {
        screen = createVolatileImage(pixel.width, pixel.height);                
        long start;
        long elapsed;
        long wait;          
        long currentTime = System.currentTimeMillis();          
        while (run) {
            start = System.nanoTime();
            fps++;
            if(System.currentTimeMillis()  - currentTime >= 1000){
            //  System.out.println("fps:" + fps);    
                currentTime = System.currentTimeMillis();
                fps = 0;
            }
            tick();
            render();
            elapsed = System.nanoTime() -start;    
            wait = targetTime = elapsed / 1000000;              
            try {
                Thread.sleep(wait);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public void keyTyped(KeyEvent i) {
    }

    public void keyPressed(KeyEvent i) {
        Keys.keySet(i.getKeyCode(), true);    
    }

    public void keyReleased(KeyEvent i) {
        Keys.keySet(i.getKeyCode(), false);
    }    
}

【问题讨论】:

    标签: java image swing fullscreen


    【解决方案1】:
    【解决方案2】:

    使用java.awt 包中的默认Graphics 对象,您可以使用drawImage method with 10 parameters

    int destinationWidth = ...;
    int destinationHeight = ...;
    g.drawImage(originalImage, 0, 0, destinationWidth, destinationHeight, 0, 0, originalImage.getWidth(null), originalImage.getHeight(null), null);
    

    这样您的图像将被缩放并绘制为g。请注意,如果您的窗口的纵横比与图像的纵横比不同,只需使用提供的示例中的 as 即可拉伸和变形您的图像。

    【讨论】:

    • 一步缩放缩放不是缩放图像的最佳选择
    • @MadProgrammer 你能详细说明一下吗?
    • @MadProgrammer 我认为这不是最佳选择,因为内存泄漏或类似的东西......但这只是质量与性能之间的旧困境。当然,OP 应该意识到这一点,但这并不会使答案无效。
    • 没有说这是一个不好的答案,只是它有问题;)
    【解决方案3】:

    尝试使用 Toolkit.getScreenSize()

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    double width = screenSize.getWidth();
    double height = screenSize.getHeight();
    

    要调整图像大小,您可以使用简单的 imgscalr

    BufferedImage scaledImage = Scalr.resize(myImage, 100);
    

    【讨论】:

    • 但是我该如何调整图像大小
    • 我如何将它应用到我的图像中?
    • 你需要在方法的某个地方设置它:调整你的图像大小可以无处不在。当您第一次使用它时,它可能在构造函数中,或者您可能需要一些 init 方法。你应该决定。
    • 标量代表什么?
    • @user50369 关于 Scalr 你可以在这里查看官方 javadoc thebuzzmedia.com/downloads/software/imgscalr/javadoc/org/…
    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多