From 2dedc4416aba4f88601f0f2d7dde1cd23a136d41 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Tue, 19 Nov 2024 13:56:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B5=D1=88=D0=B8=D1=84=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab3/app/Main.hs | 36 +++++++++++++++++++++++------------- lab3/src/Lib.hs | 18 ++++++++++++++++++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/lab3/app/Main.hs b/lab3/app/Main.hs index ae30eeb..462ae35 100644 --- a/lab3/app/Main.hs +++ b/lab3/app/Main.hs @@ -14,21 +14,18 @@ bitsPerByte = 1 main :: IO () main = do + putStrLn "Чтение текста из файла \"resources/biography.txt\"" inputText <- readFile "resources/biography.txt" - putStrLn $ take 30 inputText - let alphabet = createAlphabetFromText inputText - putStrLn $ show (length alphabet) - let encryptedText = encryptCaesar alphabet caesarShift inputText - putStrLn $ take 30 encryptedText - let encryptedTextBits = textToBits encryptedText - putStrLn $ concat (take 30 (map show (VU.toList encryptedTextBits))) - let encryptedTextFromBits = bitsToText encryptedTextBits - putStrLn $ take 30 encryptedTextFromBits - let decryptedText = decryptCaesar alphabet caesarShift encryptedTextFromBits - putStrLn $ take 30 decryptedText - readImageResult <- readImage "resources/david.bmp" - case readImageResult of + putStrLn "\nШифрование текста" + let alphabet = createAlphabetFromText inputText + putStrLn $ "Размер алфавита: " ++ show (length alphabet) + let encryptedText = encryptCaesar alphabet caesarShift inputText + let encryptedTextBits = textToBits encryptedText + + putStrLn "\nКодирование текста в изображение" + readSourceImageResult <- readImage "resources/david.bmp" + case readSourceImageResult of Left err -> putStrLn $ "Ошибка при чтении изображения: " ++ err Right dynImg -> do let img = convertRGB8 dynImg @@ -39,3 +36,16 @@ main = do let resultImage = generateImage (encodePixel bitsPerByte img bitsPadded) width height saveBmpImage "tmp/david.bmp" (ImageRGB8 resultImage) + + + putStrLn "\nДекодирование текста из изображения" + readEncodedImageResult <- readImage "tmp/david.bmp" + case readEncodedImageResult of + Left err -> putStrLn $ "Ошибка при чтении изображения: " ++ err + Right dynImg -> do + let img = convertRGB8 dynImg + let bits = VU.fromList $ extractBitsFromImage bitsPerByte img + let fullText = bitsToText bits + let encryptedTextFromImage = takeWhile (/= '\NUL') fullText + let decryptedText = decryptCaesar alphabet caesarShift encryptedTextFromImage + writeFile "tmp/biography.txt" decryptedText \ No newline at end of file diff --git a/lab3/src/Lib.hs b/lab3/src/Lib.hs index b3bf126..ad5615e 100644 --- a/lab3/src/Lib.hs +++ b/lab3/src/Lib.hs @@ -95,3 +95,21 @@ encodePixel bitsPerByte img bits x y = PixelRGB8 newR newG newB newR = intToWord8 $ ((word8ToInt r) .&. mask) .|. bitsIntR newG = intToWord8 $ ((word8ToInt g) .&. mask) .|. bitsIntG newB = intToWord8 $ ((word8ToInt b) .&. mask) .|. bitsIntB + +extractBits :: Int -> Pixel8 -> [Int] +extractBits bitsPerByte pixelByte = + [ if testBit pixelByte i then 1 else 0 | i <- [bitsPerByte-1, bitsPerByte-2..0] ] + +extractBitsFromPixel :: Int -> PixelRGB8 -> [Int] +extractBitsFromPixel bitsPerByte (PixelRGB8 r g b) = + let bitsR = extractBits bitsPerByte r + bitsG = extractBits bitsPerByte g + bitsB = extractBits bitsPerByte b + in bitsR ++ bitsG ++ bitsB + +extractBitsFromImage :: Int -> Image PixelRGB8 -> [Int] +extractBitsFromImage bitsPerByte img = + let width = imageWidth img + height = imageHeight img + pixels = [ pixelAt img x y | y <- [0..height - 1], x <- [0..width - 1] ] + in concatMap (extractBitsFromPixel bitsPerByte) pixels \ No newline at end of file