views:

490

answers:

3

Hi guys, I've to create a bmp image from two txt files.The first one is an mxn array:

* * * * * * * *
m n
c11 c21 .. cm1
...
c1n c2n .. cmn
* * * * * * * *

* * * * * * * *
6 5
.7 .7 .6 1.0 1.2 .1
.9 .3 .7 1.1 .7 .2
1 1.1 1.2 1.3 1.7 .6
.5 .6 .5 .4 .9 .1101
2 .1 .1 .1 2.1 1.1
* * * * * * * *

The second txt file is a color scale, like this

* * * * * * * *
min1 max1 r1 g1 b1
min2 max2 r2 g2 b2
...
minx maxx rx gx bx
* * * * * * * *

* * * * * * * *
0 .5 255 128 64
.5 .75 128 255 32
.75 1.25 64 64 225
01.50 5 128 128 0
* * * * * * * *

So I've to read from this two files. I've tried to create an array from the first txt file using StringTokenizer class but I'm lost at all. From the two files I've to create a bmp image. Someone can help me in some way?

+3  A: 

If the colour ranges are continous (your example is missing 1.25-1.5) and are guaranteed to cover all possble values in the matrix file, I would first have built a TreeMap<Double, java.awt.Color>, using the max value from the colour file as map key. You can then use the TreeMap#ceilingEntry(K) method to get the colour for any matrix value. E.g. if populated correctly with your test data, ceilingEntry(0.2).getValue() will return Color(255,128,64).

Instead of reading the matrix file into an array, you could more easily directly use a java.awt.BufferedImage to draw into and later use javax.imageio.ImageIO to write the buffered image as a BMP file.

jarnbjo
thanx you very much
soneangel
I would give the best answer both!
soneangel
+1  A: 

Sigh... while I wrote the program down, @jarnbjo explained the same idea. But here you have some code:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.NavigableMap;
import java.util.TreeMap;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageParser {
    public static void main(String[] args) {
        String dataContent = 
            "6 5\n" + 
            ".7 .7 .6 1.0 1.2 .1\n" + 
            ".9 .3 .7 1.1 .7 .2\n" + 
            "1 1.1 1.2 1.3 1.7 .6\n" + 
            ".5 .6 .5 .4 .9 .1101\n" + 
            "2 .1 .1 .1 2.1 1.1";

        String colorContent = 
            "0 .5 255 128 64\n" + 
            ".5 .75 128 255 32\n" + 
            ".75 1.25 64 64 225\n" + 
            "01.50 5 128 128 0";

        int width = 0;
        int height = 0;
        BufferedImage image = null;

        NavigableMap<Double, Integer> colorMap = new TreeMap<Double, Integer>();
        for (String colorLine : colorContent.split( "\n" )) {
            String[] colorValues = colorLine.split( " " );
            colorMap.put( Double.parseDouble( colorValues[1] ), 
                    Integer.parseInt( colorValues[2] ) << 16 | 
                    Integer.parseInt( colorValues[3] ) << 8 | 
                    Integer.parseInt( colorValues[4] ) );
        }
        boolean headerParsed = false;
        int y = 0;
        for( String dataLine : dataContent.split( "\n" ) ) {
            String[] dataArray = dataLine.split( " " );
            if( !headerParsed ) {
                width = Integer.parseInt( dataArray[ 0 ] );
                height = Integer.parseInt( dataArray[ 1 ] );
                image = new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB );
                headerParsed = true;
            }
            else {
                int x = 0;
                for( String data : dataArray ) {
                    Integer rgbValue = colorMap.higherEntry( Double.parseDouble( data ) ).getValue();
                    image.setRGB( x, y, rgbValue );
                    x++;
                }
                y++;
            }
        }

        JFrame frame = new JFrame();
        frame.getContentPane().add( new Viewer( image, width, height, 20 ) );
        frame.pack();
        frame.setVisible( true );
    }

    static class Viewer extends JPanel {
        Image m_image;
        int m_width;
        int m_height;
        int m_zoom;
        public Viewer( Image image, int width, int height, int zoom ) {
            m_image = image;
            m_width = width;
            m_height = height;
            m_zoom = zoom;
        }

        @Override
        public void paint(Graphics g) {
            g.drawImage( m_image, 0, 0, m_width * m_zoom, m_height * m_zoom, this );
        }
    };
}
tangens
thank you very much!
soneangel
I would give the best answer both!
soneangel
A: 

In the same while (I need more time lol) I wrote just the code to save into the array the first matrix file :( here is the code just if you want to give a look and it works. But actually I'm on yours. I'll let you know what I'll reach. Thank you guys...

import java.io.*;
import java.util.StringTokenizer;

public class TokenizerUser4 {

public static double[][] matrix;

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

 FileReader reader = new FileReader
  ("D:\\sonenos\\java\\FlussiIO\\new\\matrix.txt");  

 BufferedReader br = new BufferedReader(reader);

 String line;
 int rowIndex = 0;
 int counter = 0;
 int[] dim = new int[3]; 

 while ((line = br.readLine()) != null){

  counter++;

  if (counter == 1) {

   StringTokenizer dimensioni = new StringTokenizer(line);
   //int[] dim = new int[3];
   int i = 0;
   while(dimensioni.hasMoreTokens()){
    dim[i] = Integer.parseInt(dimensioni.nextToken());
    //System.out.println(dim[i] + " i=" + i);
    i++;

   }
   matrix = new double[dim[0]][dim[1]];
  }

  if (counter != 1){
   StringTokenizer theLine = new StringTokenizer(line); 

   int colIndex = 0;

   while (theLine.hasMoreTokens()){

    String st = theLine.nextToken();
    matrix[rowIndex][colIndex] = Double.parseDouble(st);

    colIndex = colIndex + 1;
   }

   rowIndex = rowIndex + 1;
  }    
 }

 for (int x = 0; x<dim[0];x++){
  for (int y = 0; y<dim[1]; y++){
   System.out.print(matrix[x][y] + " ");
  }
  System.out.println("\n");
 }

 br.close();  
}

}

soneangel