public void Test() { var bmp1 = (Bitmap)Image.FromFile(@"C:\Users\FessEmpty\Downloads\parallelprogramming-shpora2016-56f562c98bbf\parallelprogramming-shpora2016-56f562c98bbf\JPEG\sample.bmp"); var bitmapData1 = bmp1.LockBits(new Rectangle(0, 0, bmp1.Width, bmp1.Height), ImageLockMode.ReadOnly, bmp1.PixelFormat); const int rgpPixelSize = 3; var additional = bitmapData1.Stride - bitmapData1.Width * rgpPixelSize; var result = new RgbPixel[bmp1.Height, bmp1.Width]; unsafe { var imagePointer = (byte *)bitmapData1.Scan0; for (var j = 0; j < bitmapData1.Height; j++, imagePointer += additional) { for (var i = 0; i < bitmapData1.Width; i++, imagePointer += rgpPixelSize) { result[j, i] = new RgbPixel(imagePointer[0], imagePointer[1], imagePointer[2]); } } } bmp1.UnlockBits(bitmapData1); var convert = MatrixRgbToYCbCrConveter.Convert(result); var back = MatrixYCbCrToRgbConverter.Convert(convert); var bmp2 = new Bitmap(bmp1.Width, bmp1.Height, bmp1.PixelFormat); var bitmapData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), ImageLockMode.ReadOnly, bmp2.PixelFormat); unsafe { var imagePointer = (byte *)bitmapData2.Scan0; for (var j = 0; j < bitmapData2.Height; j++, imagePointer += additional) { for (var i = 0; i < bitmapData2.Width; i++, imagePointer += rgpPixelSize) { imagePointer[0] = back[j, i].R; imagePointer[1] = back[j, i].G; imagePointer[2] = back[j, i].B; } } } bmp2.UnlockBits(bitmapData2); bmp2.Save(@"C:\Users\FessEmpty\Downloads\parallelprogramming-shpora2016-56f562c98bbf\parallelprogramming-shpora2016-56f562c98bbf\JPEG\sampleTest.bmp", ImageFormat.Bmp); }
public Bitmap Decompress(CompressedImage compressedImage) { var unHuf = HuffmanCodec.Decode(compressedImage.DataBytes, compressedImage.DecodeTable, compressedImage.BitsCount); var unRle = Rle <byte> .Decode(unHuf).ToArray(); var yDct = new List <double>(); var cbDct = new List <double>(); var crDct = new List <double>(); var countYBlocks = compressedImage.ThinIndex * compressedImage.ThinIndex; var cellsToBlock = compressedImage.CompressionLevel; for (var i = 0; i < unRle.Length;) { for (var j = 0; j < countYBlocks * cellsToBlock; j++) { yDct.Add(unRle[i++]); } for (var j = 0; j < cellsToBlock; j++) { cbDct.Add(unRle[i++]); } for (var j = 0; j < cellsToBlock; j++) { crDct.Add(unRle[i++]); } } var yDctBlocks = DevideIntoPiece(yDct, compressedImage.CompressionLevel); var cbDctBlocks = DevideIntoPiece(cbDct, compressedImage.CompressionLevel); var crDctBlocks = DevideIntoPiece(crDct, compressedImage.CompressionLevel); var yChannel = _dctDecompressor.Decompress(yDctBlocks, _dctSize, compressedImage.Height, compressedImage.Width, _lumiaMatrixProvider.GetMatrix()); var thinnedCbChannel = _dctDecompressor.Decompress(cbDctBlocks, _dctSize, compressedImage.Height / compressedImage.ThinIndex, compressedImage.Width / compressedImage.ThinIndex, _colorMatrixProvider.GetMatrix()); var thinnedCrChannel = _dctDecompressor.Decompress(crDctBlocks, _dctSize, compressedImage.Height / compressedImage.ThinIndex, compressedImage.Width / compressedImage.ThinIndex, _colorMatrixProvider.GetMatrix()); var cbChannel = _pieceMatrixExtender.Extend(thinnedCbChannel, compressedImage.ThinIndex); var crChannel = _pieceMatrixExtender.Extend(thinnedCrChannel, compressedImage.ThinIndex); var yCbCrChannels = new YCbCrChannels(yChannel, cbChannel, crChannel); var yCbCrPixels = _iChannelsPacker.Pack(yCbCrChannels, compressedImage.Height, compressedImage.Width); var matrixRgbPixels = MatrixYCbCrToRgbConverter.Convert(yCbCrPixels); var bmp = _bitmapBuilder.Build(matrixRgbPixels); return(bmp); }