JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區 » Swing/AWT/SWT/JFace  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Image縮放的問題
phoenix_shing

Java狂人



發文: 43
積分: 0
於 2008-02-07 10:49 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Image的縮放, 目前我知道有兩種方式 :
1.
1
drawImage(img, x1, y1, x2, y2, imgObserver)

2.
1
image.getScaledInstance(width, height, hint)


就<<Leaning Java>>裡所提到, 是以第2種方式較好, 因為圖片在真正被使用前, 會先載入並做比例縮放的動作. 能提升程式的效能. 可是 :
1. 我實際在執行時, 第2種方式圖片顯示的速度較慢, 程式跑起來要過一段時間才會看到圖片
2. 就程式上來說, 會先建構出一個原比例的Image物件, 然後再根據這個物件去取得比例縮放後的Image物件

就這兩點來看, 我怎樣都感覺第1種會比第2種來得優(至少第1種寫法程式一跑起來就可以看到圖片了...), 請各位先進指點, 到底第2種是否真的比第1種來得優? 又, 到底好在哪?

以下附上我實驗的程式碼, 確定可以執行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class DrawImagePrac extends JPanel {
 
  private static final long serialVersionUID = 1;
 
  private JFrame jFrame;
  public static final int SIMPLE = 0;
  public static final int SCALE_PANEL = 1;
  public static final int SCALE_IMAGE = 2;
  private int methodType = 1;
  private Image img;
  private Image scaledimg;
 
  public DrawImagePrac() {
    try {
      //Image size : 1181 * 1383
      img = Toolkit.getDefaultToolkit().getImage("/home/devil/qoo.jpg");
      scaledimg = img.getScaledInstance(((int)(1181 * 0.42)), ((int)(1383 * 0.42)), Image.SCALE_AREA_AVERAGING);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
  public static void main(String[] s) {
    new DrawImagePrac().go();
  }
 
  private void go() {
    jFrame = new JFrame();
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.setBounds(0, 0, 800, 660);
 
    jFrame.getContentPane().add(this, BorderLayout.CENTER);
    jFrame.setVisible(true);
  }
 
  public void paint(Graphics g) {
    g.fillRect(0, 0, 800, 600);
    int width = img.getWidth(this);
    int height = img.getHeight(this);
    double scaleFromWidth = (double)800 / (double)width;
    double scaleFromHeight = (double)600 / (double)height;
    double runScale = (width > height)? scaleFromWidth : scaleFromHeight;
    width = (int)(runScale * width);
    height = (int)(runScale * height);
    int x = (800 - width) / 2;
    int y = (600 - height) / 2;
    
    Graphics2D g2d = (Graphics2D)g;
 
    switch (methodType) {
    case SCALE_IMAGE:
      g2d.drawImage(scaledimg, x, y, this);
      break;
 
    case SCALE_PANEL:
      g2d.drawImage(img, x, y, width, height, this);
      break;
 
    case SIMPLE:
    default:
      g2d.drawImage(img, 0, 0, this);
      break;
    }
  }
}
 


reply to postreply to post
忘心無我欲沉醉
情遊Java笑.NET
丁丁不識編程趣
臥看DP現雲蹤
話題樹型展開
人氣 標題 作者 字數 發文時間
1988 Image縮放的問題 phoenix_shing 2490 2008-02-07 10:49
» JWorld@TW »  Java SE 討論區 » Swing/AWT/SWT/JFace

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8