У меня есть только данные изображения без информации заголовка, но я знаю несколько вещей, например:
- 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 файл