img2html v2Haskell-versio vanhemmasta img2html-pätkästä (http://mureakuha.com/koodikirjasto/1054). -- img2html.hs
--
-- Muuntaa PNG/JPG-kuvan HTML-muotoon.
--
-- Ohjeet:
-- 1. Asenna kirjasto "stb-image" cabalilla "cabal install stb-image"
-- 2. Aja ghc --make -o img2html img2html.hs
-- 3. Käyttö: img2html kuva.(png|jpeg|bmp|gif) > kuva.html
--
-- Testattu:
-- GHC 6.10.4, 6.12.1
--
-- (c) 2009 ane. BSD v3-lisenssi.
module Main where
import System (getArgs)
import Text.Printf
import Data.List
import Data.Char
import Data.Bitmap.IO
import Codec.Image.STB
import Data.ByteString (unpack)
import Data.ByteString.Internal
-- Jaa lista ensin 3-tupliin ja sen jälkeen w suuruisiin listoihin
bitmapToRGBVals :: ByteString -> Int -> [[(Int, Int, Int)]]
bitmapToRGBVals res width = chunk width (chunksToTuple (chunk 3 (result)))
where
-- Word8 -> Char -> Int
result = map (ord . w2c) . unpack $ res
-- Jakaa listan n-suurusiin osiin. Tätä tarvitaan, koska copyBitmapToByteString
-- palauttaa listan [r0, g0, b0, r1, g1, b1, ..., rN, gN, bN] jolloin RGB-arvot
-- saadaan 3-tupleen.
chunk :: Int -> [a] -> [[a]]
chunk _ [] = [[]]
chunk n xs = y1 : chunk n y2
where
(y1, y2) = splitAt n xs
chunksToTuple :: [[Int]] -> [(Int, Int, Int)]
chunksToTuple list@(x:xs) = map toTuple (filter (not . null) list)
where
toTuple [r, g, b] = (r, g, b)
-- Muuntaa rgb-tuplen html-tagiksi värin kanssa
rgbToHexString :: (Int, Int, Int) -> String
rgbToHexString (r, g, b) = printf "<b style=\"color: #%02x%02x%02x\">X</b>" r g b
main = do
args <- getArgs
if null args then putStrLn "Usage: img2hmtl pic.(png|jpg|gif|bmp) > output.html" else do
img <- loadImage (head args)
case img of
Left err -> putStrLn err
Right image ->
do
let (w, h) = bitmapSize image
-- Muunna kuva ByteStringiksi
img_data <- copyBitmapToByteString image
let rows = bitmapToRGBVals img_data w
putStrLn "<html><head><style type=\"text/css\">body { text-align: center; font: 5px Monospace; background: black; }</style></head><body>"
-- Muunna listojen RGB-tuplet merkkijonoiksi ja erota jokainen <br/>-tagilla
putStrLn (intercalate "<br/>" (map (\row -> concatMap rgbToHexString row) rows))
putStrLn "</body></html>"
|
  Haku

|