Неизвестный 16-битный формат файла серого изображения без заголовка - PullRequest
0 голосов
/ 21 июня 2020

У меня есть только данные изображения без информации заголовка, но я знаю несколько вещей, например:

  • 16-битные данные в оттенках серого
  • 1200x1200 (хотя это 1200x900, но, вероятно, будет «полоса» внизу)
  • размер данных составляет 2880000 байт, что соответствует 1200x1200 x 2 байта -> короткий вот необработанные данные изображения для визуализации я использую это:
    public static void saveImage(short[] pix, int width, int height, File outputfile) {
        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
        int[] nBits = {16};
        ComponentColorModel cm = new ComponentColorModel(cs, nBits,false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT);
        SampleModel sm = cm.createCompatibleSampleModel(width, height);
        DataBufferShort db = new DataBufferShort(pix, width*height);
        WritableRaster raster = Raster.createWritableRaster(sm, db, null);
        BufferedImage bf = new BufferedImage(cm, raster, false, null);
        if(outputfile!=null)
            try {
                if(!ImageIO.write(bf, "png", outputfile)) System.out.println("No writer found.");
                System.out.println("Saved: "+outputfile.getAbsolutePath());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        else System.out.println("error");
    }

Данные читаются так (только экспериментальный / плохой код, только для тестирования):

            for(int tt=1; tt<20; tt++) {
                pix = new short[1200*1200];
                i = 0;
                int z = 0;
                int line = 0;
                //loop
                while(i<(1200*1200)) {
                    pix[i++] = buffer.getShort(z);
                    z += tt;
                    if(z>=(len-1)) {
                        line += 2;
                        z = line;
                        if(z>=(len-1)) {
                            System.out.println("break at "+z);
                            break;
                        }
                        System.out.println("test "+line);
                    }
                }
                System.out.println("img_"+imgcount+".png "+pix.length);
                saveImage(pix, 1200, 1200, new File("img_"+imgcount+"_"+tt+".png"));
            }

Где я могу увидеть что-то для tt = 4,8,16 ( изображения умножаются), но я действительно не могу получить всю картину. изображение tt = 8 изображение tt = 16 Это похоже на решение передо мной, но я не вижу его xD Может кто-нибудь помогите мне с алгоритмом / форматом, в котором хранится изображение?

РЕДАКТИРОВАТЬ: Последовательное чтение данных с помощью:

            short[] pix = new short[1200*1200];
            int i = 0;
            while(i< (1200*1200) && buffer.remaining()>0) {
                pix[i++] = buffer.getShort();
            }

приводит к: шумному изображению

РЕДАКТИРОВАТЬ 2: Хорошо, похоже, его кодировка base64, что имеет смысл, поскольку оно хранится в a xml файл

1 Ответ

0 голосов
/ 21 июня 2020

Я наконец решил это, его кодировка base64 и прямой порядок байтов (спасибо RealSkepti c за подсказку, чтобы попробовать маленький / большой порядок байтов).

...