Почему getSubImage большого изображения исправляет пустые пиксели? - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть программа, которая создает спрайт-лист из папки изображений. Вот код:

int length = 1000;
BufferedImage sheet = new BufferedImage(1280*length/3, 720/3, 
BufferedImage.TYPE_INT_RGB);
for(int i = 0; i < length; i++) {
    String path = i+".jpg";
    try {
        load = ImageIO.read(getClass().getResourceAsStream(path));
        sheet.getGraphics().drawImage(load, (i%100)*1280/3, (i/100)*720/3, null);
    }catch (IOException e) {
        System.out.println("Failed to load "+path);
        e.printStackTrace();
    }
}
try {
    ImageIO.write(sheet, "jpg", new File("spriteSheet"));
} catch (IOException e) {
    System.out.println("Failed to write spriteSheet.");
    e.printStackTrace();
}
this.stop();

В основном это работало, но половина второго и последнего ряда и вся последняя строка сохранялись в виде сплошного холста пикселей коричневого цвета. Чтобы увидеть, были ли отдельные изображения, преобразованные в спрайт-лист, проблемой, я добавил этот код сразу после рисования изображения на листе:

BufferedImage current = sheet.getSubimage((i%100)*1280/3, (i/100)*720/3, 1280/3, 720/3);
render(current);

и метод рендеринга:

public void render(BufferedImage image) {
    BufferStrategy bs = getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();
    g.drawImage(image, 0, 0, width, height, null);
    g.dispose();
    bs.show();
}

И после того, как этот код был добавлен, лист полностью прорисовывался без каких-либо пикселей коричневого цветаПочему получение вспомогательного изображения листа во время записи, похоже, решает эту проблему?

Редактировать: Хорошо, проблема не полностью устранена. Иногда он по-прежнему рисует нижний ряд в виде пикселей коричневого цвета. Если я снова запускаю программу, она обычно исправит это. Иногда он делает это 1-й раз, иногда 2-й, иногда требуется 3 пробега ...

...