Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //-----------------------------------------SWAPMAP GENERATING--------------------------------------------------------//
- int[] MakeSwapMap(int BitmapWidth, int BitmapHeight, Random random)
- {
- int Count = ((BitmapWidth * BitmapHeight) / 8) / 8;
- int[] SwapMap = new int[Count];
- for (int i = 0; i < Count; i++)
- {
- SwapMap[i] = random.NextInt(i, Count);
- }
- return SwapMap;
- }
- int[] MakeSwapMap(int BitmapWidth, int BitmapHeight, string StringSeed)
- {
- Xorgens4096 random = new Xorgens4096(StringSeed);
- int Count = ((BitmapWidth * BitmapHeight) / 8) / 8;
- int[] SwapMap = new int[Count];
- for (int i = 0; i < Count; i++)
- {
- SwapMap[i] = random.NextInt(i, Count);
- }
- return SwapMap;
- }
- //-----------------------------------------BITMAP SHUFFLING----------------------------------------------------------//
- Bitmap ShuffleBitmap(Bitmap bitmap, int[] SwapMap)
- {
- int Width = bitmap.Width; //Ширина битмапа
- int Height = bitmap.Height; //Высота битмапа
- //Проверка на правильный размер картинки
- if ((Width % 8 != 0) && (Height % 8 != 0))
- throw new ArgumentOutOfRangeException("Размер изображения должен быть кратным 8");
- //Проверяем что карта подмен соответсвует для этого битмапа
- if (SwapMap.Length != (((Width * Height) / 8) / 8))
- throw new ArgumentOutOfRangeException("Неверный размер карты подмен");
- //Свапаем по карте подмен через цикл
- for (int i = 0; i < SwapMap.Length; i++)
- {
- int swapIndex = SwapMap[i];
- int firstX = ((i * 8) % Width);
- int firstY = ((i * 8) / Width) * 8;
- int secondX = ((swapIndex * 8) % Width);
- int secondY = ((swapIndex * 8) / Width) * 8;
- for (int y = 0; y < 8; y++)
- {
- for (int x = 0; x < 8; x++)
- {
- //Попиксельно обмениваем пиксели местами
- Color firstPx = bitmap.GetPixel(firstX + x, firstY + y);
- Color secondPx = bitmap.GetPixel(secondX + x, secondY + y);
- bitmap.SetPixel(firstX + x, firstY + y, secondPx);
- bitmap.SetPixel(secondX + x, secondY + y, firstPx);
- }
- }
- }
- return bitmap;
- }
- Bitmap UnShuffleBitmap(Bitmap bitmap, int[] SwapMap)
- {
- int Width = bitmap.Width; //Ширина битмапа
- int Height = bitmap.Height; //Высота битмапа
- //Проверка на правильный размер картинки
- if ((Width % 8 != 0) && (Height % 8 != 0))
- throw new ArgumentOutOfRangeException("Размер изображения должен быть кратным 8");
- //Проверяем что карта подмен соответсвует для этого битмапа
- if (SwapMap.Length != (((Width * Height) / 8) / 8))
- throw new ArgumentOutOfRangeException("Неверный размер карты подмен");
- //Для дешифрации просто читаем карту подмен задом-наперед
- for (int i = SwapMap.Length - 1; i >= 0; i--)
- {
- int swapIndex = SwapMap[i];
- int firstX = ((i * 8) % Width);
- int firstY = ((i * 8) / Width) * 8;
- int secondX = ((swapIndex * 8) % Width);
- int secondY = ((swapIndex * 8) / Width) * 8;
- for (int y = 0; y < 8; y++)
- {
- for (int x = 0; x < 8; x++)
- {
- //Попиксельно обмениваем пиксели местами
- Color firstPx = bitmap.GetPixel(firstX + x, firstY + y);
- Color secondPx = bitmap.GetPixel(secondX + x, secondY + y);
- bitmap.SetPixel(firstX + x, firstY + y, secondPx);
- bitmap.SetPixel(secondX + x, secondY + y, firstPx);
- }
- }
- }
- return bitmap;
- }
- //------------------------------------------VIDEO SHUFFLING----------------------------------------------------------//
- void ShuffleVideo(VideoFileReader reader, VideoFileWriter writer, string StringSeed)
- {
- CurrentFrame = 0; //Счетчик текущего кадра, чтобы менять карту подмен каждые 1/4 секунды (250мс)
- //Генерируем начальную карту подмен
- uint[] SwapMap = MakeSwapMap(writer.Width, writer.Height, StringSeed);
- while (true)
- {
- //Читаем кадр
- using (Bitmap readedFrame = reader.ReadVideoFrame())
- {
- if (readedFrame == null) { break; } //Если прочитаный кадр равен null, то кадры закончились
- CurrentFrame++; //Кадр прочитан успешно
- //Обновляем карту подмен каждые 1/4 секунды (250мс)
- if (CurrentFrame % (reader.FrameRate / 4) == 0)
- SwapMap = MakeSwapMap(writer.Width, writer.Height, StringSeed);
- //Перемешиваем и записываем кадр
- writer.WriteVideoFrame(ShuffleBitmap(readedFrame, SwapMap));
- }
- }
- }
- void UnShuffleVideo(VideoFileReader reader, VideoFileWriter writer, string StringSeed)
- {
- CurrentFrame = 0; //Счетчик текущего кадра, чтобы менять карту подмен каждые 1/4 секунды (250мс)
- //Генерируем начальную карту подмен
- uint[] SwapMap = MakeSwapMap(writer.Width, writer.Height, StringSeed);
- while (true)
- {
- //Читаем кадр
- using (Bitmap readedFrame = reader.ReadVideoFrame())
- {
- if (readedFrame == null) { break; } //Если прочитаный кадр равен null, то кадры закончились
- CurrentFrame++; //Кадр прочитан успешно
- //Обновляем карту подмен каждые 1/4 секунды (250мс)
- if (CurrentFrame % (reader.FrameRate / 4) == 0)
- SwapMap = MakeSwapMap(writer.Width, writer.Height, StringSeed);
- //Перемешиваем и записываем кадр
- writer.WriteVideoFrame(UnShuffleBitmap(readedFrame, SwapMap));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement