Спасибо за это. Я также вижу небольшое улучшение с бикубическим, но рендеринг настолько медленный, что на самом деле это того не стоит. Что я мог бы сделать, так это рассмотреть вопрос об увеличении и уменьшении файлов изображений перед их рисованием.
из попыток был использоватьTexturePaint
а такжеg.fillRect()
рисовать изображение. Это, однако, требует от вас создания новых объектов TexturePaint и Rectangle2D каждый раз, когда вы рисуете изображение, что не является идеальным - и в любом случае не помогает.
Когда я используюg.drawImage(BufferedImage,...)
повернутые изображения выглядят размытыми / мягкими.
Я знаком сRenderingHints и двойная буферизация (что я и делаю, я думаю), мне просто трудно поверить, что вы не можете легко и эффективно вращать изображение в Java, которое дает резкие результаты.
Код для использованияTexturePaint
выглядит примерно так.
Grahics2D g2d = (Graphics2D)g;
g2d.setPaint(new TexturePaint(bufferedImage, new Rectangle2D.Float(0,0,50,50)));
g2d.fillRect(0,0,50,50);
я используюAffineTransform
повернуть карточную руку в веер. Как лучше всего быстро нарисовать красивые картинки?
Вот скриншот:
9 четкий, но остальные карты определенно не такие острые.
Возможно, проблема заключается в том, что я создаю каждое изображение карты и сохраняю его в массиве.
Вот как я это делаю на данный момент:
// i from 0 to 52, card codes.
...
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage img = gc.createCompatibleImage(86, 126, Transparency.TRANSLUCENT);
Graphics2D g = img.createGraphics();
setRenderingHints(g);
g.drawImage(shadow, 0, 0, 86, 126, null);
g.drawImage(white, 3, 3, 80, 120, null);
g.drawImage(suit, 3, 3, 80, 120, null);
g.drawImage(value, 3, 3, 80, 120, null);
g.dispose();
cardImages[i] = img;
}
private void setRenderingHints(Graphics2D g){
g.setRenderingHint(KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setRenderingHint(KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
}
Как я должен подходить к этому по-другому? Благодарю.
Редактировать:
Без рендеринга
Установка AA подсказок не имеет значения. Также настройкаRenderingHints при создании изображений тоже без разницы. Это только когда они вращаются сAffineTransform
и окрашены с помощьюg.drawImage(...)
что они кажутся размытыми.
Изображение выше показывает разницу между значением по умолчанию (ближайший сосед) и билинейной интерполяцией.
Вот как я сейчас их рисую (намного быстрее, чем TexturePaint):
// GamePanel.java
private void paintCard(Graphics2D g, int code, int x, int y){
g.drawImage(imageLoader.getCard(code), x, y, 86, 126, null);
}
// ImageLoader.java
public BufferedImage getCard(int code){
return cardImages[code];
}
Все мои карты имеют размер 80x120, а shadow .png - 86x126, чтобы вокруг карты оставалась полупрозрачная тень размером 3px. Это не реалистичная тень, я знаю, но она выглядит хорошо.
И вот вопрос становится ...Как вы можете получить четкие результаты рисования при вращении BufferedImage?
Ссылка на предыдущий вопрос, также касающийся раздуваемой карты:
Как вы можете обнаружить событие щелчка мыши на объекте изображения в Java?
Баунти-Edit: Итак, после долгих обсуждений я сделал несколько тестовых карт .svg, чтобы посмотреть, как SVG Salamander будет делать их рендеринг. К сожалению, производительность ужасна. Моя реализация достаточно чиста, учитывая, что с BufferedImage с двойной буферизацией рисование было невероятно быстрым. Это значит, что я прошел полный круг и вернулся к своей первоначальной проблеме.
Я дам 50 наград тому, кто сможет дать мне решение, чтобы получить резкие повороты BufferedImage. Предлагалось сделать изображения больше, чем они должны быть, и уменьшить их до рисования, а также использовать бикубическую интерполяцию. Если это единственно возможные решения, то я действительно не знаю, куда идти дальше, и мне, возможно, придется иметь дело с размытыми поворотами - потому что оба из них налагают снижение производительности.
Я могу закончить свою игру, если найду способ сделать это хорошо. Спасибо всем. :)