img2html v2

ane 22.12.09 21:39

Haskell-versio vanhemmasta img2html-pätkästä (http://mureakuha.com/koodikirjasto/1054).

 Tekstiversio  Arvo: 1 (3 ääntä)  Äänestä: +  -
-- 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>"