Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在图形方法drawImage()中使用ImageObserver_Java_Image_Applet_Scale_Draw - Fatal编程技术网

Java 如何在图形方法drawImage()中使用ImageObserver

Java 如何在图形方法drawImage()中使用ImageObserver,java,image,applet,scale,draw,Java,Image,Applet,Scale,Draw,我尝试使用的方法是: drawImage(image,int,int,int,int,ImageObserver)方法 因此,我可以缩放我的图像,在我看到的所有示例中,ImageObserver应该是这样,但这似乎不起作用(即,我看到的唯一方法是: drawImage(image,int,int,ImageObserver),不知道这是否有区别) 下面是我的主要类,即小程序: import java.applet.*; import java.awt.*; public class Main

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

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

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

除非调用的类是,否则使用
this
作为
ImageObserver
的参数将不起作用:

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
的图像的大小(例如已包含要调整大小的图像的图像),则您只需提交
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);
也就是说,我将为我的图像大小调整库插入一个小插件

如果只需要调整图像的大小,可以通过以下代码简单地完成:

Thumbnails.of("path/to/image")
  .size(100, 100)
  .toFile("path/to/thumbnail");
Thumbnailator足够灵活,可以接受
BuffereImage
s、
File
s和
InputStream
s作为输入


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

由于每次从
Applet.drawImage
调用时都要调用
drawHitter
方法,因此使用
Graphics.drawImage
的调整大小操作会被多次调用,即使
hitterWidth
hitterHeight
出于所有目的都是常量


提前调整
图像的大小
,并使用
drawHitter
方法绘制预调整大小的图像将更有效。

您的问题太模糊了。请发布演示问题的代码。