Несмотря на то, что вы говорите, что это не работает, я использовал clearRect
довольно хорошо.
Очищает указанный прямоугольник, заполняя его цветом фона
текущей поверхности рисования. Эта операция не использует
текущий режим рисования.
Начиная с Java 1.1, цвет фона закадровых изображений может
быть системно зависимым. Приложения должны использовать setColor с последующим
fillRect, чтобы гарантировать, что закадровое изображение очищается до определенного
цвет.
Заполняет указанный прямоугольник. Левый и правый края
прямоугольник в х и х + ширина - 1. Верхний и нижний края в
y и y + высота - 1. Получающийся прямоугольник покрывает область ширины
пикселей в высоту по высоте пикселей в высоту. Прямоугольник заполняется с помощью
текущий цвет графического контекста.
Здесь неясно указано, что один из них установит прямоугольник для цвета фона, в то время как другой закрасит цветом переднего плана поверх текущих цветов, но это что, похоже, делает.
Это чисто предположение, но я думаю, что примечание о закадровых изображениях относится к Graphics
объектам, полученным из компонентов вне экрана AWT, поскольку они являются нативными. Я с трудом представляю, как цвет фона BufferedImage
может зависеть от системы. Поскольку документ API предназначен для Graphics
, это может быть обобщение, не применимое к делу BufferedImage
.
Мой код тестирования:
JFrame jf = new JFrame();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BufferedImage img = new BufferedImage(200, 300, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
//fill right half with opaque white
g.setColor(Color.WHITE);
g.fillRect(100, 0, 100, 300);
//leave top third as it is
//fill middle third with transparent color
g.setColor(new Color(0, true));
g.fillRect(0, 100, 200, 100);
//clear bottom third with transparent color
g.setBackground(new Color(0, true));
g.clearRect(0, 200, 200, 100);
g.dispose();
jf.add(new JLabel(new ImageIcon(img)));
jf.pack();
jf.setVisible(true);
результат - два белых квадрата, справа вверху. Если белый цвет не был окрашен или clearRect
использовался для перезаписи белого, в результате получается светло-серый цвет фона по умолчанию для рамки.
С точки зрения производительности, это обычный рисунок. arraycopy
вполне может быть быстрее, я не знаю, но, по крайней мере, это, скорее всего, аппаратное ускорение, как и любая другая операция рисования.
Плюс к решению с массивом: а) отсутствие дополнительной памяти и б) независимость от цветовой модели; это должно работать независимо от того, как было настроено изображение.
Минус по сравнению с составным решением состоит в том, что оно позволяет очищать только прямоугольники; настройка композита позволяет очистить любую форму.