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

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

@@ -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