2009-09-30 7 views
3

I가 files.The 제 하나는 m × n 개의 어레이 인이 txt 두에서 BMP 이미지를 생성했습니다

* * * * * * * *
MN
C11에서 C21 ..
CM1 ...
C1N의 C2N .. CMN
* * * * * * * *

* * * * * * * *
6 5
0.7 0.7 0.6 1.0 1.2 0.1 0.9 0.3
. 7 1.1 .7 .2
1 1.1 1.2 1 0.3 1.7 0.6 0.5 0.6
가 0.5 0.4 0.9 0.1101
2 0.1 0.1 0.1 2.1 1.1
* * * * * * * *
txt 파일에 저장된 rgb 데이터에서 bmp 파일을 만드는 방법은 무엇입니까?

제 TXT 파일 인 컬러 스케일 등이

* * * * * * * *
min1 max1의 R1의 G1은 B1
min2 MAX2의 R2 G2는 B2
...
말괄량이 맥스의 수신은 GX BX
* * * * * * * *

,* * * * * * * *
0 0.5 255 128 64
0.5 0.75 128 255 32
0.75 1.25 64 64 225
01.50 128 128 0
* * * * * * * *

그래서이 두 파일을 읽어야합니다. StringTokenizer 클래스를 사용하여 첫 번째 txt 파일에서 배열을 만들려고했으나 전혀 손실되었습니다. 두 파일에서 나는 bmp 이미지를 만들었습니다. 누군가가 어떤 식 으로든 나를 도울 수 있습니까?

+0

어떤 두 번째 파일의 최소/최대 값은? 첫 번째 파일의 값 범위는 무엇입니까? 첫 번째 파일의 값을 두 번째 파일 또는 결과 이미지에 어떻게 매핑해야합니까? – hhaamu

답변

1

한숨 ... 내가 프로그램을 작성하는 동안 @jarnbjo도 같은 생각을 설명했습니다. 그러나 여기 당신은 몇 가지 코드를 가지고 : 같은 동안

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); 
     } 
    }; 
} 
+0

대단히 감사합니다! – soneangel

+0

둘 다 가장 좋은 답을 줄 것입니다! – soneangel

4

색상 범위가 연속적이며 (예제에 1.25-1.5가 누락되어 있음) 매트릭스 파일의 모든 가능성 값을 보장하는 경우 색상 파일의 최대 값을지도로 사용하여 먼저 TreeMap<Double, java.awt.Color>을 작성해야합니다 키. 그런 다음 TreeMap#ceilingEntry(K) 메서드를 사용하여 모든 매트릭스 값의 색상을 가져올 수 있습니다. 예 : 테스트 데이터로 올바르게 채워지면 ceilingEntry (0.2) .getValue()는 Color (255,128,64)를 반환합니다.

매트릭스 파일을 배열로 읽는 대신 java.awt.BufferedImage을 직접 사용하여 javax.imageio.ImageIO을 사용하여 버퍼링 된 이미지를 BMP 파일로 쓸 수 있습니다.

+0

고맙습니다. – soneangel

+0

나는 둘 다 가장 좋은 답을 줄 것입니다! – soneangel

0

(나는 롤 더 많은 시간을 필요로) 나는 배열에 최초의 매트릭스 파일을 저장할 바로 코드를 작성 :(여기 당신이 원하는 단지 경우 코드는 내 모습을 보여 주면 작동하지만 사실은 내가 당신에게 달려 있습니다. 내가 무엇을 얻을 수 있는지 알려 드리겠습니다 ...

*;
import java.util .StringTokenizer;

공용 클래스 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();  
} 

}

관련 문제