private static Image FromBlocks(ImageBlocks imageBlocks) { var image = new Image(imageBlocks.Width, imageBlocks.Height); foreach (Block block in imageBlocks.Blocks) { switch (block.Type) { case BlockType.Y: image.X.SetSubMatrix(block.Position.x, block.Position.y, block.Values); break; case BlockType.U: image.Y.SetSubMatrix(block.Position.x, block.Position.y, block.Values, 2); break; case BlockType.V: image.Z.SetSubMatrix(block.Position.x, block.Position.y, block.Values, 2); break; default: throw new ArgumentOutOfRangeException(); } } return(image); }
public Image Decode(ImageBlocks imageBlocks) { Image image = FromBlocks(imageBlocks); YUVToRGB(image); return(image); }
private static void Main(string[] args) { Image image = PPM.ReadImage("nt-P6.ppm") !; var encoder = new Encoder(); var decoder = new Decoder(); ImageBlocks imageBlocks = encoder.Encode(image); Image decoded = decoder.Decode(imageBlocks); PPM.WriteImage("output.ppm", decoded); }
private static ImageBlocks ToBlocks(Image image) { var imageBlocks = new ImageBlocks(image.Width, image.Height); for (var i = 0; i < image.Width; i += Block.Size) { for (var j = 0; j < image.Height; j += Block.Size) { FlatMatrix <int> y = image.X.GetSubMatrix(i, j, Block.Size, Block.Size); FlatMatrix <int> u = image.X.GetSubMatrix(i, j, Block.Size, Block.Size, 2); FlatMatrix <int> v = image.X.GetSubMatrix(i, j, Block.Size, Block.Size, 2); var yBlock = new Block { Position = (i, j), Type = BlockType.Y, Values = y }; var uBlock = new Block { Position = (i, j), Type = BlockType.U, Values = u }; var vBlock = new Block { Position = (i, j), Type = BlockType.V, Values = v }; imageBlocks.Blocks.Add(yBlock); imageBlocks.Blocks.Add(uBlock); imageBlocks.Blocks.Add(vBlock); } } return(imageBlocks); } } }