如何在 Graphics 方法 drawImage() 中使用 ImageObserver [英] How to use ImageObserver in Graphics method drawImage()

查看:35
本文介绍了如何在 Graphics 方法 drawImage() 中使用 ImageObserver的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用的方法是:drawImage(image, int, int, int, int, ImageObserver) 方法这样我就可以缩放我的图像,在我见过的所有示例中,ImageObserver 应该是这个,但这似乎不起作用(即我见过的唯一方法是:drawImage(image, int, int, ImageObserver),不知道这是否有区别).

The method I am trying to use is the: drawImage(image, int, int, int, int, ImageObserver) method so that i can scale my image, on all the examples i've seen the ImageObserver should be this, but this doesn't seem to work(i.e. the only methods i have seen is: drawImage(image, int, int, ImageObserver), don't know if this makes a difference).

这是我的主要类,即小程序:

Here is my main class that is the applet:

import java.applet.*;
import java.awt.*;

public class Main extends Applet implements Runnable{
    private Thread th;
    private Hitter hitter;

    //double buffering
    private Graphics dbg;
    private Image dbImage;

    public void init(){
        hitter = new Hitter(getImage(getCodeBase(), "Chitter.png"));
    }

    public void start(){
        th = new Thread(this);
        th.start();
    }

    public void stop(){
        th.stop();
    }

    public void update(Graphics g){
        if(dbImage == null){
            dbImage = createImage(this.getSize().width, this.getSize().width);
            dbg = dbImage.getGraphics();
        }

        dbg.setColor(getBackground());
        dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
        dbg.setColor(getForeground());
        paint(dbg);

        g.drawImage(dbImage, 0, 0, this);
    }

    public void paint(Graphics g){
        hitter.drawHitter(g);
    }

    public void run() {
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        while(true){
            repaint();

            try{
                Thread.sleep(15);
            }catch(InterruptedException ex){}

            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
        }
    }

    public boolean mouseMove(Event e, int x, int y){
        hitter.move(x);

        return true;
    }

}

这是击球手类:

import java.awt.*;
import java.awt.image.ImageObserver;

public class Hitter{
    private int x, y;
    private Image hitter;
    private int hitterWidth = 50, hitterHeight = 10;
    private int appletsizeX = 500, appletsizeY = 500;

    Hitter(Image i){
        hitter = i;
        start();
    }

    public void drawHitter(Graphics g){
        g.drawImage(hitter, x, y, hitterWidth, hitterHeight, this);
    }

    public void move(int a){
        x = a;
    }

    public void start(){
        x = appletsizeX/2 - hitterWidth/2;
        y = 0;
    }
}

推荐答案

除非您正在调用的类 Graphics.drawImage(Image, int, int, int, int, ImageObserver) 是一个 ImageObserver,使用 this 作为 ImageObserver 的参数将不起作用:

Unless the class in which you are calling Graphics.drawImage(Image, int, int, int, int, ImageObserver) is an ImageObserver, using this as the argument for the ImageObserver will not work:

class MyClass {
  public void resizeImage() {
    Graphics g = getGraphicsObjectFromSomewhere();

    // The following line will not compile, as `MyClass` 
    // does not implement `ImageObserver`.
    g.drawImage(img, 0, 0, 50, 50, this);
  }
}

如果您要调整不需要 ImageObserver(例如 BufferedImage 已经包含你想要调整大小的图像),那么你就可以交出一个 null:

If you're resizing an image which does not require an ImageObserver (such as a BufferedImage that already contains the image you want to resize), then you can just hand over a null:

// The image we want to resize
BufferedImage img = ImageIO.read("some-image.jpg");

// The Graphics object of the destination
// -- this will probably just be obtained from the destination image.
Graphics g = getGraphicsObjectFromSomewhere();

// Perform the resizing. Hand a `null` for the ImageObserver,
// as we don't need one.
g.drawImage(img, 0, 0, 50, 50, null);

也就是说,我要为我的图像大小调整库插入一个小插件 Thumbnailator.

That said, I'm going to throw in a little plug for my image resizing library Thumbnailator.

如果只需要调整图像大小,则可以像以下代码一样简单地完成:

If all that is required is to resize an image, it can be accomplished as simple as the following code:

Thumbnails.of("path/to/image")
  .size(100, 100)
  .toFile("path/to/thumbnail");

缩略图足够灵活,可以接受 BufferedImages、Files 和 InputStreams 作为输入.

Thumbnailator is flexible enough to accept BufferedImages, Files, and InputStreams as input.

看到您的编辑,我建议更改 Hitter 类,以便它在构造函数中执行图像大小的调整.

Seeing your edit, I would suggest to change the Hitter class, so that it will perform the resizing of the image in the constructor.

由于每次从 Applet.drawImage 调用时都调用了 drawHitter 方法,因此正在调用使用 Graphics.drawImage 的调整大小操作很多时候,即使 hitterWidthhitterHeight 出于所有意图和目的都是常量.

Since you are calling the drawHitter method on each call from the Applet.drawImage, the resize operation using Graphics.drawImage is being called many times, even when the hitterWidth and hitterHeight are, for all intents and purposes, constants.

提前调整Image的大小,并在drawHitter方法中绘制预先调整大小的图像会更有效率.

Resizing the Image ahead of time, and drawing that pre-resized image in the drawHitter method will be more efficient.

这篇关于如何在 Graphics 方法 drawImage() 中使用 ImageObserver的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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