2011-07-10 51 views
7

Phương pháp tôi đang cố gắng sử dụng là: phương thức drawImage (hình ảnh, int, int, int, int, ImageObserver) để tôi có thể chia tỷ lệ hình ảnh của mình các ví dụ tôi đã nhìn thấy ImageObserver nên được điều này, nhưng điều này dường như không làm việc (tức là phương pháp duy nhất tôi đã thấy là: drawImage (hình ảnh, int, int, ImageObserver), không biết nếu điều này làm cho một Sự khác biệt).Cách sử dụng ImageObserver trong phương thức đồ họa drawImage()

Đây là lớp học chính của tôi đó là 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; 
    } 

} 

Đây là lớp Hitter:

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

Câu hỏi của bạn quá mơ hồ. Vui lòng đăng mã chứng minh sự cố. – g051051

Trả lời

8

Trừ lớp trong đó bạn đang gọi Graphics.drawImage(Image, int, int, int, int, ImageObserver) là một ImageObserver, sử dụng this như đối số cho số ImageObserver sẽ không hoạt động:

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

Nếu bạn thay đổi kích thước một hình ảnh mà không đòi hỏi một ImageObserver (chẳng hạn như một BufferedImage rằng đã có chứa hình ảnh mà bạn muốn thay đổi kích thước), sau đó bạn có thể chỉ giao một 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); 

Điều đó nói rằng, Tôi sẽ ném vào một plug nhỏ cho thư viện thay đổi kích thước hình ảnh của tôi Thumbnailator.

Nếu tất cả những gì cần thiết là để thay đổi kích thước một hình ảnh, nó có thể được thực hiện đơn giản như đoạn mã sau:

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

Thumbnailator là đủ linh hoạt để chấp nhận BufferedImage s, File s, và InputStream s như là đầu vào .


Thấy chỉnh sửa của bạn, tôi sẽ đề nghị thay đổi lớp Hitter, do đó nó sẽ thực hiện thay đổi kích thước của hình ảnh trong các nhà xây dựng.

Vì bạn đang gọi phương thức drawHitter trên mỗi cuộc gọi từ Applet.drawImage, hoạt động thay đổi kích thước bằng Graphics.drawImage đang được gọi là nhiều lần, ngay cả khi hitterWidthhitterHeight là, đối với tất cả các tính năng, hằng số.

Thay đổi kích thước Image trước thời hạn và vẽ hình ảnh được định lại kích thước trước đó theo phương pháp drawHitter sẽ hiệu quả hơn.

Các vấn đề liên quan