Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.
Здравствуйте, garra, Вы писали:
G>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.
G> Всем привет!
G>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.
G> Всем привет!
G>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.
Создаешь BufferedImage, берешь у него Graphics.
На нем рисуешь все что тебе захочется. Для изменения символов можно попробовать использовать java.awt.geom.AffineTransform.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, garra, Вы писали:
G>> Всем привет!
G>>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.
B>Создаешь BufferedImage, берешь у него Graphics. B>На нем рисуешь все что тебе захочется. Для изменения символов можно попробовать использовать java.awt.geom.AffineTransform.
Тут как раз два вопроса и возникают:
1.как у Graphics поставить произвольный фон (загрузить тот, который я хочу, например).
2. Как изменять положение каждой буквы(цифры)? Ведь AffineTransform осуществляет афинное преобразование всего Image. А надо КАЖДУЮ букву вертеть/двигать... Тут напрашивается решение — поставить рядом столько Image, сколько есть букв(цифр), но я не могу понять как это сделать, какой Layout для этого выбрать...
Здравствуйте, garra, Вы писали:
G>Здравствуйте, Blazkowicz, Вы писали:
B>>Здравствуйте, garra, Вы писали:
G>>> Всем привет!
G>>>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.
B>>Создаешь BufferedImage, берешь у него Graphics. B>>На нем рисуешь все что тебе захочется. Для изменения символов можно попробовать использовать java.awt.geom.AffineTransform.
G>Тут как раз два вопроса и возникают: G>1.как у Graphics поставить произвольный фон (загрузить тот, который я хочу, например).
у Graphics фона нет. У него есть набор свойст (типа цвет, цвет фона, шрифт, слили линии и .т.д ) и набор примиривных вызовов (типа drawLine и т.д. drawImage ). То есть востпринимаете его как мальберт (с усноваленым холстом). И вот используя все эти примитива и надо рисовать.
G>2. Как изменять положение каждой буквы(цифры)? Ведь AffineTransform осуществляет афинное преобразование всего Image. А надо КАЖДУЮ букву вертеть/двигать... Тут напрашивается решение — поставить рядом столько Image, сколько есть букв(цифр), но я не могу понять как это сделать, какой Layout для этого выбрать...
Тут Layout не поможет. Тут надо использовать Java2D
B>>Создаешь BufferedImage, берешь у него Graphics. B>>На нем рисуешь все что тебе захочется. Для изменения символов можно попробовать использовать java.awt.geom.AffineTransform.
G>Тут как раз два вопроса и возникают: G>1.как у Graphics поставить произвольный фон (загрузить тот, который я хочу, например).
Graphics.fillRect
G>2. Как изменять положение каждой буквы(цифры)? Ведь AffineTransform осуществляет афинное преобразование всего Image. А надо КАЖДУЮ букву вертеть/двигать... Тут напрашивается решение — поставить рядом столько Image, сколько есть букв(цифр), но я не могу понять как это сделать, какой Layout для этого выбрать...
Какой Layout?? берешь N картинок, рисуешь на каждой по цифре. Трансформируешь каждую. Результаты отрисовываешь на большую картинку. В чем сложности-то?
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, garra, Вы писали:
B>>>Создаешь BufferedImage, берешь у него Graphics. B>>>На нем рисуешь все что тебе захочется. Для изменения символов можно попробовать использовать java.awt.geom.AffineTransform.
G>>Тут как раз два вопроса и возникают: G>>1.как у Graphics поставить произвольный фон (загрузить тот, который я хочу, например). B>Graphics.fillRect
Здесь же всё равно будет браться java.lang.Color! А если я хочу красный в синюю полосочку?
G>>2. Как изменять положение каждой буквы(цифры)? Ведь AffineTransform осуществляет афинное преобразование всего Image. А надо КАЖДУЮ букву вертеть/двигать... Тут напрашивается решение — поставить рядом столько Image, сколько есть букв(цифр), но я не могу понять как это сделать, какой Layout для этого выбрать...
B>Какой Layout?? берешь N картинок, рисуешь на каждой по цифре. Трансформируешь каждую. Результаты отрисовываешь на большую картинку. В чем сложности-то?
Дело в том, что java.awt для меня малознакомая вещь И поэтому, я не очень представляю, как N картинок отрисовать в большую, да ещё и поместить это на форму.
Как бы это сделать?
Здравствуйте, garra, Вы писали:
B>>Graphics.fillRect
G>Здесь же всё равно будет браться java.lang.Color! А если я хочу красный в синюю полосочку?
Блин, ну тогда берешь TexturePaint и вперед. 8)
G>Дело в том, что java.awt для меня малознакомая вещь И поэтому, я не очень представляю, как N картинок отрисовать в большую, да ещё и поместить это на форму. G>Как бы это сделать?
drawImage.
А при чем здесь форма я не понял.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, garra, Вы писали:
B>>>Graphics.fillRect
G>>Здесь же всё равно будет браться java.lang.Color! А если я хочу красный в синюю полосочку? B>Блин, ну тогда берешь TexturePaint и вперед. 8)
G>>Дело в том, что java.awt для меня малознакомая вещь И поэтому, я не очень представляю, как N картинок отрисовать в большую, да ещё и поместить это на форму. G>>Как бы это сделать? B>drawImage. B>А при чем здесь форма я не понял.
Имелся ввиду JFrame... Как туда это всё поместить?...
Здравствуйте, garra, Вы писали:
G>Здравствуйте, Blazkowicz, Вы писали:
B>>Здравствуйте, garra, Вы писали:
B>>>>Graphics.fillRect
G>>>Здесь же всё равно будет браться java.lang.Color! А если я хочу красный в синюю полосочку? B>>Блин, ну тогда берешь TexturePaint и вперед. 8)
G>>>Дело в том, что java.awt для меня малознакомая вещь И поэтому, я не очень представляю, как N картинок отрисовать в большую, да ещё и поместить это на форму. G>>>Как бы это сделать? B>>drawImage. B>>А при чем здесь форма я не понял.
G>Имелся ввиду JFrame... Как туда это всё поместить?...
Например так :
в JFrame ложишь JPanel или Canvas и рисуешь(как я понял собранную картинку) на том че положил.....
Здравствуйте, Blazkowicz, Вы писали:
B>Какой Layout?? берешь N картинок, рисуешь на каждой по цифре. Трансформируешь каждую. Результаты отрисовываешь на большую картинку. В чем сложности-то?
Ну вы блин даете
В данном случае надо заюзать GlyphVector — например так:
public void paint(Graphics g) {
String teststring = "Mama myla ramu";
Font testfont = new Font("verdana", Font.PLAIN, 30);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(testfont);
GlyphVector glyphVector = testfont.createGlyphVector(g2.getFontRenderContext(), teststring);
glyphVector.performDefaultLayout();
for (int i = 0; i < glyphVector.getNumGlyphs(); i++) {
Rectangle2D rectangle2D = glyphVector.getGlyphPixelBounds(i, g2.getFontRenderContext(), 0, 20);
// повернем каждый символ на угол (Math.PI / 18 * i), т.е. каждый следующий на 10 градусов
AffineTransform affineTransform = AffineTransform.
getRotateInstance(Math.PI / 18 * i, rectangle2D.getWidth() / 2,
-rectangle2D.getHeight() / 2);
glyphVector.setGlyphTransform(i, affineTransform);
}
g2.drawGlyphVector(glyphVector, 10, 100);
}
Здравствуйте, Karimchik, Вы писали:
K>Здравствуйте, Blazkowicz, Вы писали:
B>>Какой Layout?? берешь N картинок, рисуешь на каждой по цифре. Трансформируешь каждую. Результаты отрисовываешь на большую картинку. В чем сложности-то?
K>Ну вы блин даете
K>В данном случае надо заюзать GlyphVector — например так:
K>
K> public void paint(Graphics g) {
K> String teststring = "Mama myla ramu";
K> Font testfont = new Font("verdana", Font.PLAIN, 30);
K> Graphics2D g2 = (Graphics2D) g;
K> g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
K> g2.setFont(testfont);
K> GlyphVector glyphVector = testfont.createGlyphVector(g2.getFontRenderContext(), teststring);
K> glyphVector.performDefaultLayout();
K> for (int i = 0; i < glyphVector.getNumGlyphs(); i++) {
K> Rectangle2D rectangle2D = glyphVector.getGlyphPixelBounds(i, g2.getFontRenderContext(), 0, 20);
K>// повернем каждый символ на угол (Math.PI / 18 * i), т.е. каждый следующий на 10 градусов
K> AffineTransform affineTransform = AffineTransform.
K> getRotateInstance(Math.PI / 18 * i, rectangle2D.getWidth() / 2,
K> -rectangle2D.getHeight() / 2);
K> glyphVector.setGlyphTransform(i, affineTransform);
K> }
K> g2.drawGlyphVector(glyphVector, 10, 100);
K> }
K>
Остаётся заливка фона произвольным, абсолютно произвольным цветом... Из какого-нить gif'а или bmp... Как и чем это можно загрузить???
Здравствуйте, garra, Вы писали:
G>Остаётся заливка фона произвольным, абсолютно произвольным цветом... Из какого-нить gif'а или bmp... Как и чем это можно загрузить???
Вот пример из книги (покроет, я надеюсь, все ваши нужды ):
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class ShowOff
extends Component {
public static void main(String[] args) {
try {
// The image is loaded either from this
// default filename or the first command-
// line argument.
// The second command-line argument specifies
// what string will be displayed. The third
// specifies at what point in the string the
// background color will change.
String filename = "D:\\myimage.jpg";
String message = "Java2D";
int split = 4;
if (args.length > 0) filename = args[0];
if (args.length > 1) message = args[1];
if (args.length > 2) split = Integer.parseInt(args[2]);
ApplicationFrame f = new ApplicationFrame("ShowOff v1.0");
f.setLayout(new BorderLayout());
ShowOff showOff = new ShowOff(filename, message, split);
f.add(showOff, BorderLayout.CENTER);
f.setSize(f.getPreferredSize());
f.center();
f.setResizable(false);
f.setVisible(true);
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
private BufferedImage mImage;
private Font mFont;
private String mMessage;
private int mSplit;
private TextLayout mLayout;
public ShowOff(String filename, String message, int split)
throws IOException, ImageFormatException {
// Get the specified image.
InputStream in = new FileInputStream(filename);
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
mImage = decoder.decodeAsBufferedImage();
in.close();
// Create a font.
mFont = new Font("Serif", Font.PLAIN, 116);
// Save the message and split.
mMessage = message;
mSplit = split;
// Set our size to match the image's size.
setSize((int) mImage.getWidth(), (int) mImage.getHeight());
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// Turn on antialiasing.
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
drawBackground(g2);
drawImageMosaic(g2);
drawText(g2);
}
protected void drawBackground(Graphics2D g2) {
// Draw circles of different colors.int side = 45;
int width = getSize().width;
int height = getSize().height;
Color[] colors = {Color.yellow, Color.cyan, Color.orange,
Color.pink, Color.magenta, Color.lightGray};
for (int y = 0; y < height; y += side) {
for (int x = 0; x < width; x += side) {
Ellipse2D ellipse = new Ellipse2D.Float(x, y, side, side);
int index = (x + y) / side % colors.length;
g2.setPaint(colors[index]);
g2.fill(ellipse);
}
}
}
protected void drawImageMosaic(Graphics2D g2) {
// Break the image up into tiles. Draw each
// tile with its own transparency, allowing
// the background to show through to varying
// degrees.int side = 36;
int width = mImage.getWidth();
int height = mImage.getHeight();
for (int y = 0; y < height; y += side) {
for (int x = 0; x < width; x += side) {
// Calculate an appropriate transparency value.float xBias = (float) x / (float) width;
float yBias = (float) y / (float) height;
float alpha = 1.0f - Math.abs(xBias - yBias);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
// Draw the subimage.int w = Math.min(side, width - x);
int h = Math.min(side, height - y);
BufferedImage tile = mImage.getSubimage(x, y, w, h);
g2.drawImage(tile, x, y, null);
}
}
// Reset the composite.
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
}
protected void drawText(Graphics2D g2) {
// Find the bounds of the entire string.
FontRenderContext frc = g2.getFontRenderContext();
mLayout = new TextLayout(mMessage, mFont, frc);
// Find the dimensions of this component.int width = getSize().width;
int height = getSize().height;
// Place the first full string, horizontally centered,
// at the bottom of the component.
Rectangle2D bounds = mLayout.getBounds();
double x = (width - bounds.getWidth()) / 2;
double y = height - bounds.getHeight();
drawString(g2, x, y, 0);
// Now draw a second version, anchored to the right side
// of the component and rotated by -PI / 2.
drawString(g2, width - bounds.getHeight(), y, -Math.PI / 2);
}
protected void drawString(Graphics2D g2,
double x, double y, double theta) {
// Transform to the requested location.
g2.translate(x, y);
// Rotate by the requested angle.
g2.rotate(theta);
// Draw the first part of the string.
String first = mMessage.substring(0, mSplit);
float width = drawBoxedString(g2, first, Color.white, Color.red, 0);
// Draw the second part of the string.
String second = mMessage.substring(mSplit);
drawBoxedString(g2, second, Color.blue, Color.white, width);
// Undo the transformations.
g2.rotate(-theta);
g2.translate(-x, -y);
}
protected float drawBoxedString(Graphics2D g2,
String s, Color c1, Color c2, double x) {
// Calculate the width of the string.
FontRenderContext frc = g2.getFontRenderContext();
TextLayout subLayout = new TextLayout(s, mFont, frc);
float advance = subLayout.getAdvance();
// Fill the background rectangle with a gradient.
GradientPaint gradient = new GradientPaint((float) x, 0, c1,
(float) (x + advance), 0, c2);
g2.setPaint(gradient);
Rectangle2D bounds = mLayout.getBounds();
Rectangle2D back = new Rectangle2D.Double(x, 0,
advance, bounds.getHeight());
g2.fill(back);
// Draw the string over the gradient rectangle.
g2.setPaint(Color.white);
g2.setFont(mFont);
g2.drawString(s, (float) x, (float) -bounds.getY());
return advance;
}
}
И соответсвенно класс ApplicationFrame
import java.awt.*;
import java.awt.event.*;
public class ApplicationFrame extends Frame {
public ApplicationFrame() {
this("ApplicationFrame v1.0");
}
public ApplicationFrame(String title) {
super(title);
createUI();
}
protected void createUI() {
setSize(500, 400);
center();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
}
public void center() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = getSize();
int x = (screenSize.width - frameSize.width) / 2;
int y = (screenSize.height - frameSize.height) / 2;
setLocation(x, y);
}
}