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

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 Lib
caesarShift :: Int
caesarShift = 66
bitsPerByte :: Int
bitsPerByte = 1
main :: IO ()
main = do
inputText <- readFile "resources/biography.txt"
@@ -29,5 +34,8 @@ main = do
let img = convertRGB8 dynImg
let width = imageWidth 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)

View File

@@ -10,6 +10,7 @@ module Lib
import Codec.Picture
import Data.Word (Word8)
import Data.Char (ord, chr)
import Data.Bits (testBit)
import qualified Data.Vector.Unboxed as VU
@@ -41,21 +42,36 @@ decryptCaesar alphabet shift =
textToBits :: String -> VU.Vector Int
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 bits
| VU.null bits = []
| otherwise = (chr $ bitsToInt (VU.take 8 bits)) : bitsToText (VU.drop 8 bits)
where
bitsToInt charBits =
sum [bit * (2 ^ index) | (bit, index) <- zip (VU.toList charBits) [7 :: Int,6..0]]
bitsToInt :: VU.Vector Int -> Int
bitsToInt charBits =
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 encodeBitsCount img bits x y = PixelRGB8 newR newG newB
encodePixel bitsPerByte img bits x y = PixelRGB8 newR newG newB
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
newR = b
newG = g
newB = r
newR = bitsR
newG = intToWord8 bitsG
newB = b