чтение данных из изображения
This commit is contained in:
@@ -305,6 +305,37 @@ encodePixel bitsPerByte img bits x y = PixelRGB8 newR newG newB
|
|||||||
\end{lstlisting}
|
\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
|
\newpage
|
||||||
\section {Результаты работы программы}
|
\section {Результаты работы программы}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user