如何从大Bufferedimage获得小图像真的很快

时间:2011-06-11 18:21:06

标签: java performance image bufferedimage clip

我有一个BufferedImage图像大小(100mb)像素6720x9239,需要许多像素为60x60的小图像

首先我使用了我在网上找到的代码

 BufferedImage bi= ImageIO.read(new File(filename));
    ......
//in paint()
Image b=createImage(new FilteredImageSource(bi.getSource(),
        new CropImageFilter(x, y , 60, 60))); 

需要等待大约1到5秒的每个小图片非常慢,因为我的应用程序需要50个图像,这意味着ppl必须w8从50到5 * 50秒面板重新加载,所以我陈到

BufferedImage bi= ImageIO.read(new File(filename));
    ......
//in paint()
BufferedImage a = imageMap.getSubimage(x, y , 60, 60);
            Image b = createImage(a.getSource());
感到非常高兴现在不得不让世界知道这个

1 个答案:

答案 0 :(得分:1)

哦,天哪,你解决了我困扰我5天的问题。我刚刚完成输入问题,即将提交。显然(现在我知道使用图像工作)当你在g2d.drawImage(Image,at,this)中使用bufferedImage时,绘图比使用Image时慢很多。像50倍慢的东西。通过将BufferedImages转换为图像(我不知道你可以做到这一点,更少可以解决问题),如下所示: 在loadBullets函数内:

        BufferedImage a;
    Image b;
 a = spriteSheetPositive.getSubimage(
                //going to use the same image 252 times until I get the motherload of data string converted to the format:
                //sprites[shotId]=spriteSheetPositive.getSubimage(x, y, width, height);
                520, //x  520,1,536,16 (small lime star) id=100
                1, //y
                16, //width
                15 //height
                );
        b= createImage(a.getSource());
        sprites[shotID]=b;

我现在可以使用spritesheet中的图像作为弹丸精灵,屏幕上有多达1,000个,没有延迟!万岁!

我原来的问题:

这是paint函数中的代码:

        for (int i = 0; i < Projectiles.size(); i++) {


        Shot02 m = (Shot02) Projectiles.get(i);
        //m.getImage();
      //  g2d.drawImage(m.getImage(), m.getIntX(), m.getIntY(), this);


        AffineTransform at = new AffineTransform();
        // 4. translate it to the center of the component
        at.translate(m.getDrawX(), m.getDrawY());
        // 3. do the actual rotation

        at.rotate(m.getAngle()); //rotation is Clockwise
        g2d.drawImage(m.getImage(), at, this);


    }

我正在制作平台透视射击游戏。我从使用简单的imageicon图像切换到从sprite表创建为subImage的bufferedImage。然而,由于该程序在屏幕上只有20个射弹落后,而以前我可能有大约1000个射弹。

private void loadBullets() {//is done only once, when the window starts
    // Get Image
    ImageIcon icon = new ImageIcon(this.getClass().getResource("AbsoluteWin\\CustomShotsPositive.png"));
    Image image = icon.getImage();

    // Create empty BufferedImage, sized to Image
    BufferedImage spriteSheetPositive =
            new BufferedImage(
            image.getWidth(null),
            image.getHeight(null),
            Transparency.BITMASK);


    // Draw Image into BufferedImage
    Graphics g = spriteSheetPositive.createGraphics();
    g.drawImage(image, 0, 0, null);

    int shotID = 1;
    System.out.println(shotID);

    while (shotID <= length) {//fills the array with the bullets from the sprite sheet spriteSheetPositive
        sprites[shotID] = spriteSheetPositive.getSubimage(
                //going to use the same image 252 times until I get the coordinates for all the other sub-images
                //sprites[shotId]=spriteSheetPositive.getSubimage(x, y, width, height);
                520, //x  520,1,536,16 (small lime star) id=100
                1, //y
                16, //width
                15 //height
                );

        shotID += 1;

    }
    System.out.println(shotID);
}

Shot02课程:

        ImageIcon ii =
            new ImageIcon(this.getClass().getResource("missile.png"));
    image = ii.getImage();

   //image=Destination.sprites[100];//is the source

这是Shot02类中的代码,用于控制项目符号使用的图像。同样,如果我取消注释第二个选项并使用BufferedImages,程序会像疯了一样慢下来。