Заготовка для генератора картинки

This commit is contained in:
2024-11-18 03:45:29 +03:00
parent 5711244be4
commit 54e266b899
2 changed files with 34 additions and 10 deletions

View File

@@ -4,9 +4,14 @@ import Codec.Picture
import qualified Data.Vector.Unboxed as VU import qualified Data.Vector.Unboxed as VU
import Lib import Lib
caesarShift :: Int caesarShift :: Int
caesarShift = 66 caesarShift = 66
bitsPerByte :: Int
bitsPerByte = 1
main :: IO () main :: IO ()
main = do main = do
inputText <- readFile "resources/biography.txt" inputText <- readFile "resources/biography.txt"
@@ -29,5 +34,8 @@ main = do
let img = convertRGB8 dynImg let img = convertRGB8 dynImg
let width = imageWidth img let width = imageWidth img
let height = imageHeight img let height = imageHeight img
let resultImage = generateImage (encodePixel 1 img encryptedTextBits) width height let totalBits = width * height * 3 * bitsPerByte
let bitsPadded = encryptedTextBits VU.++ VU.replicate (totalBits - VU.length encryptedTextBits) 0
let resultImage = generateImage (encodePixel bitsPerByte img bitsPadded) width height
saveBmpImage "tmp/david.bmp" (ImageRGB8 resultImage) saveBmpImage "tmp/david.bmp" (ImageRGB8 resultImage)

View File

@@ -10,6 +10,7 @@ module Lib
import Codec.Picture import Codec.Picture
import Data.Word (Word8)
import Data.Char (ord, chr) import Data.Char (ord, chr)
import Data.Bits (testBit) import Data.Bits (testBit)
import qualified Data.Vector.Unboxed as VU import qualified Data.Vector.Unboxed as VU
@@ -41,21 +42,36 @@ decryptCaesar alphabet shift =
textToBits :: String -> VU.Vector Int textToBits :: String -> VU.Vector Int
textToBits text = VU.fromList $ concatMap charToBits text textToBits text = VU.fromList $ concatMap charToBits text
where
charToBits c = [if testBit (ord c) i then 1 else 0 | i <- [7,6..0]] charToBits :: Char -> [Int]
charToBits c = [if testBit (ord c) i then 1 else 0 | i <- [7,6..0]]
bitsToText :: VU.Vector Int -> String bitsToText :: VU.Vector Int -> String
bitsToText bits bitsToText bits
| VU.null bits = [] | VU.null bits = []
| otherwise = (chr $ bitsToInt (VU.take 8 bits)) : bitsToText (VU.drop 8 bits) | otherwise = (chr $ bitsToInt (VU.take 8 bits)) : bitsToText (VU.drop 8 bits)
where
bitsToInt charBits = bitsToInt :: VU.Vector Int -> Int
bitsToInt charBits =
sum [bit * (2 ^ index) | (bit, index) <- zip (VU.toList charBits) [7 :: Int,6..0]] sum [bit * (2 ^ index) | (bit, index) <- zip (VU.toList charBits) [7 :: Int,6..0]]
encodePixel :: Int -> Image PixelRGB8 -> VU.Vector Int -> Int -> Int -> PixelRGB8 encodePixel :: Int -> Image PixelRGB8 -> VU.Vector Int -> Int -> Int -> PixelRGB8
encodePixel encodeBitsCount img bits x y = PixelRGB8 newR newG newB encodePixel bitsPerByte img bits x y = PixelRGB8 newR newG newB
where where
width = imageWidth img
index = x + y * width
startPos = index * 3 * bitsPerByte
pixelBits = VU.slice startPos (3 * bitsPerByte) bits
intToWord8 :: Int -> Word8
intToWord8 x = fromIntegral x
bitsR = intToWord8 $ (VU.take bitsPerByte pixelBits) VU.! 0
bitsG = bitsToInt $ VU.take bitsPerByte $ VU.drop bitsPerByte pixelBits
bitsB = bitsToInt $ VU.drop (2 * bitsPerByte) pixelBits
PixelRGB8 r g b = pixelAt img x y PixelRGB8 r g b = pixelAt img x y
newR = b newR = bitsR
newG = g newG = intToWord8 bitsG
newB = r newB = b