0

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

}


}
Airlike
  • 233
  • 2
  • 6
  • 14
  • 1
    please trim your code to what's relevant to the question – Dmitry B. Aug 14 '12 at 17:37
  • Agree with @Dmitry. You may want to put in the effort to make it easy for a volunteer to answer your question. Most of us would greatly appreciate this, and it would likely help you get better solutions quicker. – Hovercraft Full Of Eels Aug 14 '12 at 17:52
  • I think this is a little overcomplicated. You have made one string of the three strings, then split it into an array on each line. Can you not just keep the three paragraphs seperately rather than in an array of lines? You want to have String paragraph1, paragraph2, paragraph3. Then you can use g.setColor(Color.RED) to set the color for the middle paragraph to red. – ThePerson Aug 14 '12 at 17:54
  • Please don't use DataInputStream if you want to read text, its more confusing than useful. – Peter Lawrey Aug 15 '12 at 11:34

2 Answers2

1

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++);
                }
ThePerson
  • 3,048
  • 8
  • 43
  • 69
  • Just added an edit to change from boolean to an int to count paragraphs, so if ever you want to highlight a different paragraph you can change the if statement which says if(paragraphCount==2). Or, to make it at least a little nicer you could make a int called paragraphToHighlight, and compare if(paragraphCount == paragraphToHighlight) – ThePerson Aug 14 '12 at 18:13
0

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.

KadekM
  • 1,003
  • 9
  • 13
  • Would this not color the second line? This is split on new lines so if the text files contain more than one line to each file, then this will be the second line, not necessarily the second paragraph. – ThePerson Aug 14 '12 at 18:00
  • Thank you for your answer but I don't think that this would work. "index" makes sure to write the text on the next line - it does not count paragraphs. – Airlike Aug 14 '12 at 18:04