Как преобразовать многострочный текст в изображение с помощью Java

Я хочу задать один вопрос относительно моего кода: как преобразовать многострочный текст в одно изображение с помощью BufferReader. Я могу получить изображение текста, но все строки текста идут как одна строка в одной строке. Прилагаю свой код. Просмотрите мой код и предложите мне как можно скорее:

package mypack;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.imageio.ImageIO;

public class ImageDemo {
    public static void main(String[] args) throws IOException {

        // reading the String object from a file  to be converted to image
        /*File file = new File("D:/Vivek.txt");
        StringBuilder sb=new StringBuilder();
        BufferedReader reader = new BufferedReader(new FileReader(file));
        while(true)
        {
            String text=reader.readLine();
            System.out.println(text);
            if(text==null)
                break;
            sb.append(text).append(' ');
            sb.append("\n");    
        }
        String text1=sb.toString();
        reader.close();*/



        String text=new String(Files.readAllBytes(Paths.get("D:/Vivek.txt")),    StandardCharsets.UTF_8);
        System.out.println(text);
        // Image file name
        String fileName = "Image";

        // create a File Object
        File newFile = new File("D:/Vivek.jpg");

        // create the font you wish to use
        Font font = new Font("Tahoma", Font.PLAIN, 20);

        // create the FontRenderContext object which helps us to measure the
        // text
        FontRenderContext frc = new FontRenderContext(null, true, true);

        // get the height and width of the text
        Rectangle2D bounds = font.getStringBounds(text, frc);
        int w = (int) bounds.getWidth();
        int h = (int) bounds.getHeight();

        // create a BufferedImage object
        BufferedImage image = new BufferedImage(w, h,
                BufferedImage.TYPE_INT_RGB);

        // calling createGraphics() to get the Graphics2D
        Graphics2D g = image.createGraphics();

        // set color and other parameters
        g.setColor(Color.white);
        g.fillRect(0, 0, w, h);
        g.setColor(Color.BLACK);
        g.setFont(font);

        g.drawString(text, (float) bounds.getX(), (float) -bounds.getY());

        // releasing resources
        g.dispose();
        RenderedImage rImage = (RenderedImage) image;
        // creating the file
        ImageIO.write(rImage, "jpeg", newFile);


        //merging the two buffered images to get a new image with text along with logo.

        //load the source images
        BufferedImage img1=ImageIO.read(new File("D:/Vivek.jpg"));
        BufferedImage img2=ImageIO.read(new File("D:/logo.jpg"));
        BufferedImage joined=joinBufferedImage(img1, img2);
        ImageIO.write(joined, "png", new File("D:/Joined.png"));
        System.out.println("Success");

    }
      public static BufferedImage joinBufferedImage(BufferedImage img1,BufferedImage img2) {

            //do some calculate first
            int offset  = 500;
            int wid = img1.getWidth()+img2.getWidth()+offset;
            int height = Math.max(img1.getHeight(),img2.getHeight())+offset;

            //create a new buffer and draw two image into the new image
            BufferedImage newImage = new BufferedImage(wid,height, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = newImage.createGraphics();
            Color oldColor = g2.getColor();

            //fill background
            g2.setPaint(Color.WHITE);
            g2.fillRect(0, 0, wid, height);

            //draw image
            g2.setColor(oldColor);
            g2.drawImage(img2, null, 0, 0);
            g2.drawImage(img1, null, 170, 150);
            g2.dispose();

            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            return newImage;
        }
}

person Vivek Prakash Mathur    schedule 26.12.2014    source источник


Ответы (1)


Привет, я пишу несколько строк на JPanel. И вы можете написать код, который создает изображение из JPanel.

package Stakeoverflow.swingFrame;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

public class MultiLineTextToImage{
    public static void main(String[] args) {
        String text = "Hello";

        /*
           Because font metrics is based on a graphics context, we need to create
           a small, temporary image so we can ascertain the width and height
           of the final image
         */
        int width = 1000;
        int height = 1000;

        BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();
        Font font = new Font("Arial", Font.PLAIN, 48);
        g2d.setFont(font);
        FontMetrics fm = g2d.getFontMetrics();

        g2d.dispose();

        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        g2d = img.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
        g2d.setFont(font);
        //fm = g2d.getFontMetrics();
        g2d.setColor(Color.BLACK);
        File file = new File("C:\\Read.text");

        BufferedReader br=null;
        int nextLinePosition=100;
        int fontSize = 48;
        try {
            br = new BufferedReader(new FileReader(file));

            String line;
            while ((line = br.readLine()) != null) {
               g2d.drawString(line, 0, nextLinePosition);
               nextLinePosition = nextLinePosition + fontSize;
            }
        br.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Testing.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Testing.class.getName()).log(Level.SEVERE, null, ex);
        }


        g2d.dispose();
        try {
            ImageIO.write(img, "png", new File("Text.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }
}
person Community    schedule 26.12.2014
comment
@Vivek Prakash Mathur, если вам нравится форматировать строку, перейдите по этой ссылке http://docs.oracle.com/javase/tutorial/2d/text/drawmulstring.html - person JBaba; 26.12.2014
comment
Спасибо Naimish за ответ, но я не должен использовать качели. Поэтому любезно предложите мне другое решение. - person Vivek Prakash Mathur; 26.12.2014
comment
Несмотря на то, что я пробовал ваш код, но текст, исходящий из файла, все еще находится в одной строке. Проблема не решается даже при качании - person Vivek Prakash Mathur; 26.12.2014
comment
@VivekPrakashMathur Извините за предыдущее упущенное понимание, но я изменил свой ответ. На этот раз я написал код, просто предоставив файл, который преобразуется в изображение. - person JBaba; 26.12.2014
comment
Большое спасибо, приятель :) все сработало, как и ожидалось - person Vivek Prakash Mathur; 26.12.2014
comment
Эй, еще одна проблема заключается в том, что только две строки из файла преобразуются в изображение, а остальные - нет. Какое решение для этого? Ответьте на это - person Vivek Prakash Mathur; 27.12.2014
comment
@VivekPrakashMathur Чувак, для меня он отлично работает. Неважно, сколько строк. Тот же код Без изменений. - person JBaba; 27.12.2014