Advertisement
Guest User

F4

a guest
Dec 10th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 5.04 KB | None | 0 0
  1. open System
  2. open System.IO
  3.  
  4. open System.Drawing
  5. open System.Drawing.Imaging
  6.  
  7.  
  8.  
  9. // Pixel properties
  10. let CalcBrightness (color : Color) =  sqrt ((float color.R ** 2. * 0.241) +
  11.                                             (float color.G ** 2. * 0.691) +
  12.                                             (float color.B ** 2. * 0.068))
  13.  
  14. let CalcGrayscale (color : Color) = ((float color.R * 0.3)  +
  15.                                      (float color.G * 0.59) +
  16.                                      (float color.B * 0.11))
  17.                                      
  18.  
  19.  
  20. // Pixel converters
  21. let PixelToGrayscale (imgOut : Bitmap) i j curPixel =
  22.     let gscale = int <| CalcGrayscale curPixel
  23.     let gPixel = Color.FromArgb(int curPixel.A, gscale, gscale, gscale)
  24.     imgOut.SetPixel(i, j, gPixel)
  25.    
  26. let PixelToBlackAndWhite (imgOut : Bitmap) i j curPixel =
  27.     let gscale = int <| CalcGrayscale curPixel
  28.     let bw = if gscale > 127 then 255 else 0
  29.     let bwPixel = Color.FromArgb(int curPixel.A, bw, bw, bw)
  30.     imgOut.SetPixel(i, j, bwPixel)
  31.  
  32. let symbols = "@#MGH\/!?+-*. "
  33. let PixelToASCII (writer : StreamWriter) (rowLen : int)  i j curPixel =
  34.     let brightness = CalcBrightness curPixel
  35.     let index = int <| (brightness/255.0 * (float (symbols.Length - 1)))
  36.     // print few times because spacers between rows much bigger then between symbols
  37.     for x in 0..2 do
  38.         writer.Write symbols.[index]
  39.     if i = rowLen then
  40.         writer.WriteLine()
  41.      
  42.  
  43. // Basic and Async transforms
  44. let TransformIMG (imgIn : Bitmap) convertPixel =
  45.     for j in 0..(imgIn.Height-1) do
  46.         for i in 0..(imgIn.Width-1) do
  47.             let curPixel = imgIn.GetPixel(i,j)
  48.             convertPixel i j curPixel  
  49.            
  50. let AsyncTransformIMG (imgIn : Bitmap) convertPixel =
  51.     seq {
  52.         for j in 0..(imgIn.Height-1) do
  53.             for i in 0..(imgIn.Width-1) do
  54.                 let curPixel = imgIn.GetPixel(i,j)
  55.                 let asyncConvert = async {
  56.                     convertPixel i j curPixel            
  57.                 }
  58.                 yield asyncConvert
  59.     }
  60.     |> Async.Parallel
  61.  
  62.            
  63. // Image convertors
  64. let ConvertIMGtoJPG (pathIn : string) converter suff =
  65.     let imgIn = new Bitmap(pathIn)
  66.     let pathOut = pathIn.Insert(pathIn.Length - 4, suff)
  67.     let imgOut = new Bitmap(imgIn.Width, imgIn.Height)
  68.     TransformIMG imgIn (converter imgOut)
  69. //    AsyncTransformIMG imgIn (converter imgOut) |> Async.RunSynchronously |> ignore
  70.     imgOut.Save(pathOut, ImageFormat.Jpeg)
  71.    
  72. let ConvertIMGtoGrayscale (pathIn : string) =
  73.     ConvertIMGtoJPG pathIn PixelToGrayscale "_gscale"
  74.  
  75. let ConvertIMGtoBlackAndWhite (pathIn : string) =
  76.     ConvertIMGtoJPG pathIn PixelToBlackAndWhite "_bw"
  77.  
  78.  
  79. let ConvertIMGtoTXT (pathIn : string) converter suff =
  80.     let imgIn = new Bitmap(pathIn)
  81.     let pathOut = pathIn.Replace(".jpg", suff)
  82.     let writer = new StreamWriter(pathOut)
  83.     TransformIMG imgIn (converter writer (imgIn.Width-1))
  84. //    AsyncTransformIMG imgIn (converter writer imgIn.Width)|> Async.RunSynchronously |> ignore
  85.     writer.Dispose()
  86.    
  87. let ConvertIMGtoASCII (pathIn : string) =
  88.     ConvertIMGtoTXT pathIn PixelToASCII "_ASCII.txt"
  89.    
  90.  
  91.    
  92.    
  93.    
  94. // Read images from directory
  95. let ConvertDirImages dirPath convertIMG =
  96.     let filenames = System.IO.Directory.GetFiles(dirPath, "*.jpg") |> Seq.map (System.IO.Path.GetFileName)
  97.     let Transform filename =
  98.             let pathIn = Path.Combine(dirPath, filename)
  99.             convertIMG pathIn
  100.     Seq.map Transform filenames
  101.  
  102. let ConvertDirImagesToGrayscale dirPath =
  103.     ConvertDirImages dirPath ConvertIMGtoGrayscale
  104.    
  105. let ConvertDirImagesToBlackAndWhite dirPath =
  106.     ConvertDirImages dirPath ConvertIMGtoBlackAndWhite
  107.  
  108. let ConvertDirImagesToASCII dirPath =
  109.     ConvertDirImages dirPath ConvertIMGtoASCII
  110.  
  111.  
  112. // Read images from directory asynchronously
  113. let AsyncConvertDirImages dirPath convertIMG =
  114.     let filenames = System.IO.Directory.GetFiles(dirPath, "*.jpg") |> Seq.map (System.IO.Path.GetFileName)
  115.     let asyncTransform filename =
  116.         async {
  117.             let pathIn = Path.Combine(dirPath, filename)
  118.             convertIMG pathIn
  119.         }
  120.     Seq.map asyncTransform filenames
  121.     |> Async.Parallel |> Async.RunSynchronously
  122.    
  123.  
  124. let AsyncConvertDirImagesToGrayscale dirPath =
  125.     AsyncConvertDirImages dirPath ConvertIMGtoGrayscale
  126.    
  127. let AsyncConvertDirImagesToBlackAndWhite dirPath =
  128.     AsyncConvertDirImages dirPath ConvertIMGtoBlackAndWhite
  129.  
  130. let AsyncConvertDirImagesToASCII dirPath =
  131.     AsyncConvertDirImages dirPath ConvertIMGtoASCII
  132.  
  133.  
  134.  
  135.  
  136. let testDir = "C:\\Users\\kup4e\\Desktop\\Temp\\Images"
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143. let asyncStarttime =  System.DateTime.Now          
  144. AsyncConvertDirImagesToGrayscale testDir |> ignore
  145. let asyncEndtime = System.DateTime.Now - asyncStarttime
  146.  
  147.  
  148. let starttime = System.DateTime.Now
  149. ConvertDirImagesToGrayscale testDir
  150. let endtime = System.DateTime.Now - starttime
  151.  
  152. printf "AsyncTime = %A; NonAsync = %A; Difference = %A \n" asyncEndtime endtime (endtime - asyncEndtime)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement