Как получить маленькие изображения из большого Bufferedimage очень быстро - PullRequest
1 голос
/ 11 июня 2011

У меня было BufferedImage изображение размером (100 МБ) пикселей 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 изображений, что означало бы, что для перезагрузки панели потребуется от 8 до 50 * 50 секунд, поэтому я могу

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

чувствую себя действительно счастливым, теперь должен был сообщить миру об этом

1 Ответ

1 голос
/ 03 июля 2011

Боже мой, ты решил мою проблему, которая поставила меня в тупик на 5 дней.Я только что закончил печатать вопрос и собирался представить его.ВНИМАТЕЛЬНО (теперь, когда я знаю, что использование Images работает), когда вы используете bufferedImage в g2d.drawImage (Image, at, this), рисование НАМНОГО медленнее, чем если вы используете 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;

Теперь я могу использовать изображения из таблицы спрайтов в качествеснайперские спрайты с целым 1000 на экране одновременно без задержек!Ура!

Мой оригинальный вопрос:

Это код в функции рисования:

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


    }

Я работаю над перспективной платформерной стрелялкой.Я переключился с использования простого изображения с изображением на 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, программа замедлится как сумасшедшая.

...