Search code examples
javabufferedimagegraphics2dbmp

How to go on next line while reading the file and creating an .bmp image?


I am converting a .txt file to a .bmp file trough my java code. My .txt File contains multiple lines. I am reading every line and printing it on the image.

** My text file**

45

werwerwr

abc abc abc

xxxx

** Image(.bmp) which is getting created **

Everything gets printed in a single line like this:

45werwerwrabc abc abcxxxx

My code:

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.imageio.ImageIO;

public class TextToGraphics {

    public static void main(String[] args) {
        try {
            String storeData = "";
            String data = "";
            File f = new File("/home/vipul/Desktop/123.txt");
            BufferedReader br = new BufferedReader(new FileReader(f));

            while ((data = br.readLine()) != null) {
                storeData =storeData + data +System.lineSeparator();
            }


            BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_3BYTE_BGR);
            Graphics2D g2d = img.createGraphics();
            Font font = new Font("Arial", Font.PLAIN, 24);
            g2d.setFont(font);

            FontMetrics fm = g2d.getFontMetrics();

            int width = fm.stringWidth(storeData);
            int height = fm.getHeight();
            g2d.dispose();

            img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
            g2d = img.createGraphics();
            g2d.setPaint ( new Color ( 255, 255, 255 ) );
           g2d.fillRect ( 0, 0, img.getWidth(), img.getHeight() );
            System.out.println(img.getWidth()+" "+img.getHeight());
            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);


           g2d.drawString(storeData, 0, fm.getAscent());
            g2d.dispose();

            ImageIO.write(img, "bmp", new File("/home/vipul/Desktop/123.bmp"));

        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

}

I want to make image same as the text file. If text file goes to new line then image should also have the same words on new line.

Kindly help. Thanks in advance!!!


Solution

  • You are saving your file in a string. Even if you append a lineSeparator after each line img doesn't know what newline character is. You have to split your data yourself and call drawString for each line. Example :

    public class TextToGraphics {
    
    public static void main(String[] args) {
        try {
            String storeData = "";
            String data = "";
            File f = new File("/home/vipul/Desktop/123.txt");
            BufferedReader br = new BufferedReader(new FileReader(f));
    
            while ((data = br.readLine()) != null) {
                storeData =storeData + data +System.lineSeparator();
            }
            String [] sArr = storeData.split("\n");
            int longest =0;
            int lines = 0;
            for (String s : sArr){       //find the longest string
                if(s.length()>longest){
                longest = s.length();
                }
                lines++;              //count lines
            }
    
            BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_3BYTE_BGR);
            Graphics2D g2d = img.createGraphics();
            Font font = new Font("Arial", Font.PLAIN, 24);
            g2d.setFont(font);
    
            FontMetrics fm = g2d.getFontMetrics();
    
            int width = fm.stringWidth(storeData);
            int height = fm.getHeight();
            g2d.dispose();
    
            img = new BufferedImage(longest*font.getSize(), lines*font.getSize(), BufferedImage.TYPE_3BYTE_BGR); // set width and height in accordance with longest string and number of lines
            g2d = img.createGraphics();
            g2d.setPaint ( new Color ( 255, 255, 255 ) );
           g2d.fillRect ( 0, 0, img.getWidth(), img.getHeight() );
            System.out.println(img.getWidth()+" "+img.getHeight());
            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);
            int i = 0;
            for(String s : storeData.split("\n")){            
                g2d.drawString(s, 0, fm.getAscent()+i); // call drawString for each line
                i+=10;
            }
            g2d.dispose();
    
            ImageIO.write(img, "bmp", new File("/home/vipul/Desktop/123.bmp"));
    
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    
    }
    

    }