سؤال

لدي إنشاء صورة BMP من ملفين TXT. أول واحد هو صفيف MXN:

* * * * * * * *
مين
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
* * * * * * * *

ملف TXT الثاني هو مقياس اللون، مثل هذا

* * * * * * * *
MIN1 MAX1 R1 G1 B1
Min2 Max2 R2 G2 B2
...
مينكس ماكسكس 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
* * * * * * * *

لذلك أنا قرأت من هذا الملفين. لقد حاولت إنشاء صفيف من ملف TXT الأول باستخدام فئة StringtOknizer لكنني فقدت على الإطلاق. من الملفين، قمت بإنشاء صورة BMP. شخص ما يمكن أن يساعدني بطريقة ما؟

هل كانت مفيدة؟

المحلول

تنهد ... بينما كتبت البرنامج لأسفل، أوضح 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 );
        }
    };
}

نصائح أخرى

إذا كانت نطاقات الألوان مستمرة (مثالك مفقود 1.25-1.5) ويضمن لتغطية جميع قيم الممكنة في ملف المصفوفة، فسأي لأول مرة TreeMap<Double, java.awt.Color>, باستخدام القيمة القصوى من ملف اللون كسيارة الخريطة. يمكنك بعد ذلك استخدام TreeMap#ceilingEntry(K) طريقة للحصول على اللون لأي قيمة مصفوفة. على سبيل المثال، إذا كانت مكتظة بشكل صحيح مع بيانات الاختبار الخاصة بك، فسترجع CeilingEntry (0.2) .getValue () اللون () لون (255،128،64).

بدلا من قراءة ملف Matrix في صفيف، يمكنك بسهولة استخدام أ java.awt.BufferedImage للرسم والاستخدام لاحقا javax.imageio.ImageIO لكتابة الصورة المخزوجة كملف BMP.

في نفس الشيء (أحتاج إلى مزيد من الوقت لول) كتبت فقط الرمز للحفظ في صفيف ملف مصفوفة الأول :( هنا هو الرمز فقط إذا كنت ترغب في إلقاء نظرة ويعمل. ولكن في الواقع أنا على لك . سأعلمك ما سأوصل إليه. شكرا لك يا رفاق ...

import java.io.*;<br>
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();     
}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top