private void LoadGameImageFromStream(Stream data)
        {
            var unzip = new UnZipper(data);

            using (var stream = unzip.GetFileStream(string.Format("{0}/{0}_org.jpg", _stage.Name)))
            {
                using (var are = new AutoResetEvent(false))
                {
                    Dispatcher.BeginInvoke(() => {
                        var bgBitmap = new BitmapImage();
                        bgBitmap.SetSource(stream);
                        UpperPictureCanvas.Background = new ImageBrush { ImageSource = bgBitmap };
                        LowerPictureCanvas.Background = new ImageBrush { ImageSource = bgBitmap };
                        are.Set();
                    });
                    are.WaitOne();
                }
            }

            // Load all the changes consist in the game file
            _changes.Clear();
            foreach (var filename in unzip.GetFileNamesInZip().Where(s => s.Contains("Change")))
            {
                var change = Regex.Match(filename, ChangeRegex);
                var fileName = Regex.Match(filename, FileRegex);
                if (!change.Success || !fileName.Success) continue;

                if (_changes.Keys.Contains(change.Value))
                {
                    _changes[change.Value].Add(fileName.Groups[1].Value);
                }
                else
                {
                    _changes.Add(change.Value, new List<string> { fileName.Groups[1].Value });
                }
            }

            // Randomly pick 4 of the changes
            while (_changes.Keys.Count > 6)
            {
                _changes.Remove(_changes.Keys.ElementAt(_random.Next(_changes.Keys.Count)));
            }

            Dispatcher.BeginInvoke(() =>
            {
                // Add those changes to the Game
                var count = 0;
                foreach (var changeList in _changes.Keys)
                {
                    foreach (var fileName in _changes[changeList])
                    {
                        AddImageToGrid(unzip, fileName,
                                       string.Format("{0}/{1}/{0}_{2}.jpg", _stage.Name, changeList, fileName),
                                       count % 2 == 0 ? UpperPictureGrid : LowerPictureGrid);
                        AddImageToGrid(unzip, fileName, "trans.png",
                                       count%2 == 1 ? UpperPictureGrid : LowerPictureGrid);
                    }
                    count++;
                }

                GameImageLoadCompleted();
            });
        }
        private void AddImageToGrid(UnZipper unzipFile, string fileName, string filePath, Grid grid)
        {
            var fileNameIntVal = int.Parse(fileName) - 1;
            var colCount = grid.ColumnDefinitions.Count;

            using (Stream stream = unzipFile.GetFileStream(filePath))
            {
                var img = new Image();
                var bitmap = new BitmapImage();
                bitmap.SetSource(stream);
                img.Source = bitmap;
                Grid.SetRow(img, fileNameIntVal / colCount);
                Grid.SetColumn(img, fileNameIntVal % colCount);
                img.Tag = fileName;
                img.Tap += ImgCellOnTap;
                grid.Children.Add(img);
            }
        }