/// <summary> /// Method to read data /// </summary> /// <param name="i"></param> public override void Read(ArrayDataIO i) { // Don't need to read null data (noted by Jens Knudstrup) if (byteSize == 0) { return; } SetFileOffset(i); //if(i is RandomAccess) if (i.CanSeek) { //tiler = new ImageDataTiler(this, (RandomAccess) i, ((RandomAccess) i).FilePointer, dataDescription); tiler = new ImageDataTiler(this, (RandomAccess)i, ((Stream)i).Position, dataDescription); try { double pos = i.Position; //pos = i.Seek((int)byteSize) - pos; i.Seek(byteSize); } catch (IOException e) { throw new FitsException("Unable to skip over data:" + e); } } else { dataArray = ArrayFuncs.NewInstance(dataDescription.type, dataDescription.dims); try { i.ReadArray(dataArray); } catch (IOException e) { throw new FitsException("Unable to read image data:" + e); } tiler = new ImageDataTiler(this, null, 0, dataDescription); } int pad = FitsUtil.Padding(TrueSize); try { long pos = i.Seek(pad); if (pos != pad) { throw new FitsException("Error skipping padding"); } } catch (IOException e) { throw new FitsException("Error reading image padding:" + e); } }
public void test() { float[][] data = new float[300][]; for (int i = 0; i < 300; i++) { data[i] = new float[300]; } for (int i = 0; i < 300; i += 1) { for (int j = 0; j < 300; j += 1) { data[i][j] = 1000 * i + j; } } Fits f = null; try { f = new Fits(); BufferedFile bf = new BufferedFile(TestFileSetup.GetTargetFilename("tiler1.fits"), FileAccess.ReadWrite, FileShare.ReadWrite); f.AddHDU(Fits.MakeHDU(data)); f.Write(bf); bf.Close(); bf.Dispose(); f.Close(); f = new Fits(TestFileSetup.GetTargetFilename("tiler1.fits")); ImageHDU h = (ImageHDU)f.ReadHDU(); ImageTiler t = h.Tiler; doTile("t1", data, t, 200, 200, 50, 50); doTile("t2", data, t, 133, 133, 72, 26); Object o = h.Data.Kernel; doTile("t3", data, t, 200, 200, 50, 50); doTile("t4", data, t, 133, 133, 72, 26); } finally { if (f != null) { f.Close(); } } }
void doTile(String test, float[][] data, ImageTiler t, int x, int y, int nx, int ny) { float[] tile = new float[nx * ny]; t.GetTile(tile, new int[] { y, x }, new int[] { ny, nx }); float sum0 = 0; float sum1 = 0; for (int i = 0; i < nx; i += 1) { for (int j = 0; j < ny; j += 1) { sum0 += tile[i + j * nx]; sum1 += data[j + y][i + x]; } } Assert.AreEqual(sum0, sum1); }
private void importPNGButton_Click(object sender, EventArgs e) { getFiles(); if (GFXFile == null) return; if (PalFile == null) return; if (LayoutFile == null) return; int offs = bg.topLayer ? 256 : 576; int palOffs = bg.topLayer ? 8 : 10; OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = LanguageManager.Get("Filters", "png"); ofd.CheckFileExists = true; if (ofd.ShowDialog() != DialogResult.OK) return; string filename = ofd.FileName; Bitmap b = new Bitmap(filename); ImageTiler ti = new ImageTiler(b); Color[] palette = ImageIndexer.createPaletteForImage(b); ByteArrayOutputStream oo = new ByteArrayOutputStream(); for (int i = 0; i < palette.Length; i++) oo.writeUShort(NSMBTileset.toRGB15(palette[i])); for (int i = 0; i < 256; i++) oo.writeUShort(0); PalFile.beginEdit(this); PalFile.replace(ROM.LZ77_Compress(oo.getArray()), this); PalFile.endEdit(this); GFXFile.beginEdit(this); GFXFile.replace(ROM.LZ77_Compress(ImageIndexer.indexImageWithPalette(ti.tileBuffer, palette)), this); GFXFile.endEdit(this); b.Dispose(); ByteArrayOutputStream layout = new ByteArrayOutputStream(); for (int y = 0; y < 64; y++) for (int x = 0; x < 64; x++) layout.writeUShort((ushort)((ti.tileMap[x, y] + offs) | (palOffs<<12))); LayoutFile.beginEdit(this); LayoutFile.replace(ROM.LZ77_Compress(layout.getArray()), this); LayoutFile.endEdit(this); }