Заготовка для генератора картинки
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user