import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.AffineTransform;
import java.util.Vector;
import java.awt.geom.Point2D;
public class Main {
    
    
    public Main() {
       
         ImageIcon  image = new  ImageIcon(getClass().getResource("Raptor.PNG"));
        Image i1 =image.getImage();
     
        BufferedImage bimage = new BufferedImage( i1.getWidth(null), i1.getHeight(null), BufferedImage.TYPE_INT_ARGB);   
        Graphics2D bg2d = bimage.createGraphics();
        bg2d.drawImage(i1,0,0,null);
        
         Image im = bimage.getScaledInstance(200, 200, Image.SCALE_AREA_AVERAGING);
        bg2d.dispose();
    }
    
  
    public static void main(String[] args) {
       Main m =new Main();
      
    }
    
}生成的im图形长宽均为-1, 不明白

解决方案 »

  1.   

    ImageIcon  image = new  ImageIcon(getClass().getResource("Raptor.PNG"));
    Image i1 =image.getImage();你这问题十之八九出在这俩语句上。系统需要从底层构建出一个image对象来,速度可能比较慢,而程序并不等待构建结束就进行下一步操作,可能等到bg2d.drawImage(i1,0,0,null);这条语句的时候,构建还没完成,自然就draw不上Image了。
        解决方法一般是在上两条语句下边,添加一个MediaTracker的对象,使用MediaTracker来等待图像加载完毕再进行其他操作。
      

  2.   

    i1.getWidth的参数不能为null,必须是一个可观察的ImageObserver接口
    //----------------------
    这样才行
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import javax.swing.JPanel;public class Main extends JPanel {
      Image i1 = Toolkit.getDefaultToolkit().createImage("D:/vml/images/jxx.gif");  public Main() {
        System.out.println(i1.getWidth(this));
      }  public static void main(String[] args) {
        Main m = new Main();
      }  public void paint(Graphics g) {
        g.drawImage(i1, 20, 20, this);
        System.out.println(i1.getWidth(this));
      }
    }
      

  3.   

    import java.awt.BorderLayout;
    public class PaintFrame extends JFrame { public PaintFrame() {
    this.setLayout(new BorderLayout());
    this.add(new JPanel() {
    public void paintComponent(Graphics g) {
    super.paintComponents(g);
    ImageIcon image = new ImageIcon(getClass().getResource("Dock.png"));
    Image i1 = image.getImage();
    System.err.println(i1.getWidth(null));
    BufferedImage bimage = new BufferedImage(i1.getWidth(null), i1.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    Graphics2D bg2d = bimage.createGraphics();
    bg2d.drawImage(i1, 0, 0, null);
    g.drawImage(bimage, 0,0,null);;
    Image im = bimage.getScaledInstance(200, 200, Image.SCALE_AREA_AVERAGING);
    g.drawImage(im, 0, 0, null);;
    bg2d.dispose();
    }
    });
    initComponents(); } public static void main(String[] args) {
    PaintFrame m = new PaintFrame();
    m.setVisible(true);
    } private void initComponents() {
    System.currentTimeMillis();
    setSize(500, 375);
    }}
    可以正常运行啊
    我用jdk6测试成功,理论上
      

  4.   

    在你的类里加一个方法waitImage,然后在ImageIcon image = new ImageIcon(getClass().getResource("Raptor.PNG"));
    Image i1 =image.getImage();后调用一次试试。private void waitImage(Image img) {
    MediaTracker mt = new MediaTracker(this);
    try {
    mt.addImage(img, 0);
    mt.waitForAll();
    } catch (InterruptedException ex) {
    ex.printStackTrace();
    } finally {
    mt.removeImage(img);
    }
    }
    }
      

  5.   

    import javax.swing.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.awt.geom.AffineTransform;
    import java.util.Vector;
    import java.awt.geom.Point2D;
    public class Main {
        
        
        public Main() {
           
             ImageIcon  image = new  ImageIcon(getClass().getResource("Raptor.PNG"));
            Image i1 =image.getImage();
         
            BufferedImage bimage = new BufferedImage( i1.getWidth(null), i1.getHeight(null), BufferedImage.TYPE_INT_ARGB);   
            Graphics2D bg2d = bimage.createGraphics();
    ------->>>>>>>
            bg2d.drawImage(i1,0,0,null);
    -------------<<<<
    这个地方错了,应该写成----〉〉〉〉bg2d.drawImage(i1,0,0,i1.getWidth(null), i1.getHeight(null),null)
            
             Image im = bimage.getScaledInstance(200, 200, Image.SCALE_AREA_AVERAGING);
            bg2d.dispose();
        }
        
      
        public static void main(String[] args) {
           Main m =new Main();
          
        }
        
    }