From 30652490238a308b83359018837d5a2e47269c48 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Tue, 19 Nov 2024 20:05:57 +0300 Subject: [PATCH] =?UTF-8?q?=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B8=D0=B7=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab3/report/report.tex | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lab3/report/report.tex b/lab3/report/report.tex index 9a86ee8..7a71b8f 100644 --- a/lab3/report/report.tex +++ b/lab3/report/report.tex @@ -305,6 +305,37 @@ encodePixel bitsPerByte img bits x y = PixelRGB8 newR newG newB \end{lstlisting} + \subsection{Чтение зашифрованных данных из изображения} + + Код функций для чтения зашифрованных данных из изображения представлен в листинге~\ref{lst:readImg}. Функция \texttt{extractBits} извлекает заданное количество бит из одного байта пикселя. Она принимает число бит на байт и байт пикселя, возвращая список бит. Функция \texttt{extractBitsFromPixel} предназначена для извлечения бит из всех трёх цветовых каналов (\(R, G, B\)) пикселя. Она объединяет списки бит из каждого канала в один общий список. Для извлечения бит из всего изображения используется функция \texttt{extractBitsFromImage}. Она последовательно обрабатывает все пиксели изображения, извлекая биты с помощью \texttt{extractBitsFromPixel}, и объединяет их в общий список. + + Функция \texttt{extractShift} извлекает смещения для шифра Цезаря из названия файла изображения. + +\begin{lstlisting}[caption={Функции для чтения зашифрованных данных из изображения.}, label={lst:readImg}] +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 + +extractShift :: String -> Maybe Int +extractShift path = + let shift = takeWhile (`elem` ['0'..'9']) (reverse $ takeWhile (/= '_') (reverse path)) + in readMaybe shift +\end{lstlisting} + \newpage \section {Результаты работы программы}