Question

I'm creating a string out of three smaller strings which I read in from three different text-files and then write the string into an image. I'd like to change the color for the paragraph in the middle of a created image. I can create the image with its three paragraphes, which looks like this.

But how could I change the font color of the paragraph in the middle to the color red?

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.imageio.ImageIO;




public class writeToImage {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    int imgnumber = 0;

      FileInputStream fstream1 = null;
      FileInputStream fstream2 = null;
      FileInputStream fstream3 = null;
    try {
        fstream1 = new FileInputStream("vorlauf.txt");
        fstream2 = new FileInputStream("mitte.txt");
        fstream3 = new FileInputStream("nachlauf.txt");

    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
      // Get the object of DataInputStream
      DataInputStream vorlauf = new DataInputStream(fstream1);
      BufferedReader br1 = new BufferedReader(new InputStreamReader(vorlauf));

      DataInputStream mitte = new DataInputStream(fstream2);
      BufferedReader br2 = new BufferedReader(new InputStreamReader(mitte));

      DataInputStream nachlauf = new DataInputStream(fstream3);
      BufferedReader br3 = new BufferedReader(new InputStreamReader(nachlauf));

      String vorlauf1   = null;
      String mitte1 = null;
      String nachlauf1  = null;


        try {
            while ((vorlauf1 = br1.readLine()) != null && (mitte1 = br2.readLine()) != null && (nachlauf1 = br3.readLine()) != null){
            try {

                String vorlaufdiv = StringDivider(vorlauf1);
                String mittediv = StringDivider(mitte1);
                String nachlaufdiv = StringDivider(nachlauf1);


                String totalPassage = vorlaufdiv + "\n\n" + mittediv + "\n\n" + nachlaufdiv;

                //Image file name
                   String fileName = "English-translated-";

                   imgnumber++;

                    //create a File Object
                    File newFile = new File("./" + fileName + imgnumber + ".jpg");

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

                    //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(totalPassage, frc);
                    int w = 750;
                    int h = 430;

                    //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);

                    int index = 0;
                    String[] parts = totalPassage.split("\n");
                    for(String part : parts){
                    g.drawString(part, (float) bounds.getX(), (float) -bounds.getY() + 20 * index++);
                    }


                  //releasing resources
                  g.dispose();

                    //creating the file

                    try {
                        ImageIO.write(image, "jpg", newFile);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }


            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            }


        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }





    }

public static String StringDivider(String s){

    StringBuilder sb = new StringBuilder(s);

    int i = 0;
    while ((i = sb.indexOf(" ", i + 100)) != -1) {
        sb.replace(i, i + 1, "\n");
    }

    return sb.toString();

}


}
Was it helpful?

Solution

This really isn't the way you want to do it... if you read the comments there are better ways, but here is a way which should work without you having to change anything else. This will color the first time \n\n appears in your string, so it is providing that your files do not contain \n\n.

                int index = 0;
                int paragraphCount = 1; // starting on first paragraph
                String[] parts = totalPassage.split("\n");
                for(String part : parts){
                   if(part.length() == 0) {    
                       paragraphCount++;
                   }
                   if(paragraphCount==2){
                       g.setColor(Color.RED);
                   }else{
                       g.setColor(Color.BLACK);
                   }
                    g.drawString(part, (float) bounds.getX(), (float) -bounds.getY() + 20 * index++);
                }

OTHER TIPS

I don't think your solution is nice, but simplest possible answer to your code is change your part of your code to this to have middle paragraph red.

      int index = 0;
      String[] parts = totalPassage.split("\n");
      for(String part : parts){
         if (index == 2)
             g.setColor(Color.red);
         else 
            g.setColor(Color.black);
         g.drawString(part, (float) bounds.getX(), (float) -bounds.getY() + 20 * index++);
       }

I would suggest you to hold to advices others have given you in comments.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top