Картинка на Java
От: garra  
Дата: 16.03.04 12:14
Оценка:
Всем привет!

Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.


Заранее спасибо,
Игорь
Re: Картинка на Java
От: Mishka Норвегия  
Дата: 16.03.04 12:21
Оценка:
Здравствуйте, garra, Вы писали:

G>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.


Делаешь сервлет, который рисует картинку. Вот здесь есть кое-что об этом http://www.experts-exchange.com/Programming/Programming_Languages/Java/Q_20235004.html
Re: Картинка на Java
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 16.03.04 12:24
Оценка:
Здравствуйте, garra, Вы писали:


G> Всем привет!


G>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.



G>Заранее спасибо,

G>Игорь
jimi
... << RSDN@Home 1.1.3 stable >>
Re: Картинка на Java
От: Blazkowicz Россия  
Дата: 16.03.04 12:33
Оценка:
Здравствуйте, garra, Вы писали:


G> Всем привет!


G>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.



Создаешь BufferedImage, берешь у него Graphics.
На нем рисуешь все что тебе захочется. Для изменения символов можно попробовать использовать java.awt.geom.AffineTransform.
Re[2]: Картинка на Java
От: garra  
Дата: 18.03.04 11:33
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, garra, Вы писали:



G>> Всем привет!


G>>Может быть кто-нибудь подскажет, как сделать на Java картинку, которая выглядит следующим образом — несколько цифр(букв) на одном, ПРОИЗВОЛЬНОМ фоне, причём каждая цифра(буква) может быть повёрнута под произвольным углом и быть смещена на некоторое заданное расстояние? Такие штуки, я полагаю видел каждый — при регистрации где-либо просят ввести слово или число, изображённое на картинке.




B>Создаешь BufferedImage, берешь у него Graphics.

B>На нем рисуешь все что тебе захочется. Для изменения символов можно попробовать использовать java.awt.geom.AffineTransform.

Тут как раз два вопроса и возникают:
1.как у Graphics поставить произвольный фон (загрузить тот, который я хочу, например).
2. Как изменять положение каждой буквы(цифры)? Ведь AffineTransform осуществляет афинное преобразование всего Image. А надо КАЖДУЮ букву вертеть/двигать... Тут напрашивается решение — поставить рядом столько Image, сколько есть букв(цифр), но я не могу понять как это сделать, какой Layout для этого выбрать...
Re[3]: Картинка на Java
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 18.03.04 11:44
Оценка:
Здравствуйте, 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
... << RSDN@Home 1.1.3 stable >>
Re[3]: Картинка на Java
От: Blazkowicz Россия  
Дата: 18.03.04 11:46
Оценка:
Здравствуйте, garra, Вы писали:


B>>Создаешь BufferedImage, берешь у него Graphics.

B>>На нем рисуешь все что тебе захочется. Для изменения символов можно попробовать использовать java.awt.geom.AffineTransform.

G>Тут как раз два вопроса и возникают:

G>1.как у Graphics поставить произвольный фон (загрузить тот, который я хочу, например).
Graphics.fillRect

G>2. Как изменять положение каждой буквы(цифры)? Ведь AffineTransform осуществляет афинное преобразование всего Image. А надо КАЖДУЮ букву вертеть/двигать... Тут напрашивается решение — поставить рядом столько Image, сколько есть букв(цифр), но я не могу понять как это сделать, какой Layout для этого выбрать...


Какой Layout?? берешь N картинок, рисуешь на каждой по цифре. Трансформируешь каждую. Результаты отрисовываешь на большую картинку. В чем сложности-то?
Re[4]: Картинка на Java
От: garra  
Дата: 18.03.04 12:12
Оценка:
Здравствуйте, 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 картинок отрисовать в большую, да ещё и поместить это на форму.
Как бы это сделать?
Re[5]: Картинка на Java
От: Blazkowicz Россия  
Дата: 18.03.04 12:21
Оценка:
Здравствуйте, garra, Вы писали:

B>>Graphics.fillRect


G>Здесь же всё равно будет браться java.lang.Color! А если я хочу красный в синюю полосочку?

Блин, ну тогда берешь TexturePaint и вперед. 8)

G>Дело в том, что java.awt для меня малознакомая вещь И поэтому, я не очень представляю, как N картинок отрисовать в большую, да ещё и поместить это на форму.

G>Как бы это сделать?
drawImage.
А при чем здесь форма я не понял.
Re[6]: Картинка на Java
От: garra  
Дата: 18.03.04 13:23
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, garra, Вы писали:


B>>>Graphics.fillRect


G>>Здесь же всё равно будет браться java.lang.Color! А если я хочу красный в синюю полосочку?

B>Блин, ну тогда берешь TexturePaint и вперед. 8)

G>>Дело в том, что java.awt для меня малознакомая вещь И поэтому, я не очень представляю, как N картинок отрисовать в большую, да ещё и поместить это на форму.

G>>Как бы это сделать?
B>drawImage.
B>А при чем здесь форма я не понял.

Имелся ввиду JFrame... Как туда это всё поместить?...
Re[7]: Картинка на Java
От: Alekseymir Украина  
Дата: 18.03.04 13:39
Оценка:
Здравствуйте, 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 и рисуешь(как я понял собранную картинку) на том че положил.....
Re[4]: Картинка на Java
От: Karimchik  
Дата: 18.03.04 14:40
Оценка: 9 (1) +2 :)
Здравствуйте, 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);
    }
Re[5]: Картинка на Java
От: garra  
Дата: 18.03.04 15:34
Оценка:
Здравствуйте, 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... Как и чем это можно загрузить???
Re[6]: Картинка на Java
От: Karimchik  
Дата: 18.03.04 15:59
Оценка:
Здравствуйте, 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);
    }
}
Re[7]: Картинка на Java
От: Alekseymir Украина  
Дата: 18.03.04 16:14
Оценка:
Здравствуйте, Karimchik, Вы писали:

а че за книжечка? и есть ли она в эл-ом варианте ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.