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 {Результаты работы программы}