Заготовка для генератора картинки
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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 :: Char -> [Int]
|
||||||
charToBits c = [if testBit (ord c) i then 1 else 0 | i <- [7,6..0]]
|
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 :: VU.Vector Int -> Int
|
||||||
bitsToInt charBits =
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user