public Spiht3DCoder(IntPtr image, int width, int height, int depth) { _coefficients = (short *)image.ToPointer(); _quantization = (short *)Marshal.AllocHGlobal(width * height * depth * 2); for (int i = 0; i < width * height * depth; i++) { *(_quantization + i) = 0; } _imageSize = new SubbandSize { Width = width, Height = height, Depth = depth }; _subbandSizes = SpihtHelpers.CalculateSubbands(width, height, depth); _threshold = SpihtHelpers.AbsoluteMax((short *)image.ToPointer(), width * height * depth); _lsp = new LinkedList <Spiht3DPixel>(); _lip = new LinkedList <Spiht3DPixel>(); _lis = new LinkedList <Spiht3DSet>(); _thresholdModel = new ArithmeticModel(4096); _bitModel = new ArithmeticModel(2, true); }
private void Init() { _lip.Clear(); _lsp.Clear(); _lis.Clear(); SubbandSize lowestSubband = _subbandSizes.Last(); for (byte band = 0; band < lowestSubband.Depth; band++) { for (short row = 0; row < lowestSubband.Height; row++) { for (short column = 0; column < lowestSubband.Width; column++) { _lip.AddLast(new Spiht3DPixel { X = column, Y = row, Z = band }); // Not all of them roots if ((row & 0x1) != 0 || (column & 0x1) != 0 || (band & 0x1) != 0) { _lis.AddLast(new Spiht3DSet { Type = SetType.Descendent, X = column, Y = row, Z = band }); } } } } }
private void ReconstructD(short x, short y, byte z) { SubbandSize lowestSubband = _subbandSizes.Last(); if (x >= lowestSubband.Width || y >= lowestSubband.Height || z >= lowestSubband.Depth) { if (2 * x < _imageSize.Width && 2 * y < _imageSize.Height && 2 * z < _imageSize.Depth) { SubReconstructD((short)(x * 2), (short)(y * 2), (byte)(z * 2)); } } else if ((x & 0x1) == 1 && (y & 0x1) == 0 && (z & 0x1) == 0) { SubReconstructD((short)(x + lowestSubband.Width - 1), y, z); } else if ((x & 0x1) == 0 && (y & 0x1) == 1 && (z & 0x1) == 0) { SubReconstructD(x, (short)(y + lowestSubband.Height - 1), z); } else if ((x & 0x1) == 1 && (y & 0x1) == 1 && (z & 0x1) == 0) { SubReconstructD((short)(x + lowestSubband.Width - 1), (short)(y + lowestSubband.Height - 1), z); } else if ((x & 0x1) == 0 && (y & 0x1) == 0 && (z & 0x1) == 1) { SubReconstructD(x, y, (byte)(z + lowestSubband.Depth - 1)); } else if ((x & 0x1) == 1 && (y & 0x1) == 0 && (z & 0x1) == 1) { SubReconstructD((short)(x + lowestSubband.Width - 1), y, (byte)(z + lowestSubband.Depth - 1)); } else if ((x & 0x1) == 0 && (y & 0x1) == 1 && (z & 0x1) == 1) { SubReconstructD(x, (short)(y + lowestSubband.Height - 1), (byte)(z + lowestSubband.Depth - 1)); } else if ((x & 0x1) == 1 && (y & 0x1) == 1 && (z & 0x1) == 1) { SubReconstructD((short)(x + lowestSubband.Width - 1), (short)(y + lowestSubband.Height - 1), (byte)(z + lowestSubband.Depth - 1)); } if (4 * x < _imageSize.Width && 4 * y < _imageSize.Height && 4 * z < _imageSize.Depth) { _lis.AddLast(new Spiht3DSet { Type = SetType.Grandchildren, X = x, Y = y, Z = z }); } }
private void ReconstructG(short x, short y, byte z) { SubbandSize lowestSubband = _subbandSizes.Last(); if (x >= lowestSubband.Width || y >= lowestSubband.Height || z >= lowestSubband.Depth) { if (2 * x < _imageSize.Width && 2 * y < _imageSize.Height && 2 * z < _imageSize.Depth) { SubReconstructG((short)(x * 2), (short)(y * 2), (byte)(z * 2)); } } else if ((x & 0x1) == 1 && (y & 0x1) == 0 && (z & 0x1) == 0) { SubReconstructG((short)(x + lowestSubband.Width - 1), y, z); } else if ((x & 0x1) == 0 && (y & 0x1) == 1 && (z & 0x1) == 0) { SubReconstructG(x, (short)(y + lowestSubband.Height - 1), z); } else if ((x & 0x1) == 1 && (y & 0x1) == 1 && (z & 0x1) == 0) { SubReconstructG((short)(x + lowestSubband.Width - 1), (short)(y + lowestSubband.Height - 1), z); } else if ((x & 0x1) == 0 && (y & 0x1) == 0 && (z & 0x1) == 1) { SubReconstructG(x, y, (byte)(z + lowestSubband.Depth - 1)); } else if ((x & 0x1) == 1 && (y & 0x1) == 0 && (z & 0x1) == 1) { SubReconstructG((short)(x + lowestSubband.Width - 1), y, (byte)(z + lowestSubband.Depth - 1)); } else if ((x & 0x1) == 0 && (y & 0x1) == 1 && (z & 0x1) == 1) { SubReconstructG(x, (short)(y + lowestSubband.Height - 1), (byte)(z + lowestSubband.Depth - 1)); } else if ((x & 0x1) == 1 && (y & 0x1) == 1 && (z & 0x1) == 1) { SubReconstructG((short)(x + lowestSubband.Width - 1), (short)(y + lowestSubband.Height - 1), (byte)(z + lowestSubband.Depth - 1)); } }